【问题标题】:qt - QPainter::rotate with non-perpendicular angles causes wiggly linesqt - QPainter::rotate 与非垂直角度导致摆动线
【发布时间】:2017-09-25 11:02:49
【问题描述】:

我正在尝试以非垂直角度(即 0 到 90 度之间)在小部件上绘制文本。绘制文本本身没有问题,但生成的文本非常摇摆/不均匀地绘制。

在下图中,我以 45 度角绘制文本行。第一行文字是很多下划线(“____”),第二行文字是“多线程”。此处绘制下划线而不是一条线只是为了突出问题。

如您所见,第一行显然显示文本绘制不均匀。这在第二行中更加微妙,但仍然可见。

以垂直角度(0、90、180 等)绘制不会产生这种效果。发生这种情况的任何原因?

我正在使用 Qt 5.7.0 在 Windows 10 上工作。

最小代码示例:

void MyWidget::paintEvent( QPaintEvent * /* event */ )
{
    QFont font;
    font.setPointSize( 16 );
    font.setStyleStrategy( QFont::StyleStrategy::PreferAntialias );
    setFont( font );

    QImage image( size(), QImage::Format_ARGB32_Premultiplied );
    QPainter imagePainter( &image );
    imagePainter.initFrom( this );
    imagePainter.setFont( font() );
    imagePainter.setRenderHint( QPainter::Antialiasing, true );
    imagePainter.eraseRect( rect() );
    // Set logical origo in the middle of the image
    m_window = QRect(
        - width() / 2,  // x
        - height() / 2, // y
        width(),        // w
        height()        // h
    );
    imagePainter.setWindow( m_window );
    m_viewport = QRect(
        0,              // x
        0,              // y
        width(),        // w
        height()        // h
    );
    imagePainter.setViewport( m_viewport );

    draw( imagePainter );
    imagePainter.end();

    QPainter widgetPainter( this );
    widgetPainter.drawImage( 0, 0, image );
}

void MyWidget::draw( QPainter & painter )
{
    painter.save();
    // Rotate anti-clockwise
    painter.rotate( -m_degrees );
    painter.drawText( m_window.top(), 0, tr( "Multithreads" ) );
    painter.drawText( m_window.top(), 15, tr( "__________" ) );

    painter.restore();
}

【问题讨论】:

  • 您可以尝试使用抗锯齿功能吗?
  • 你是一次画字符还是画字符串?
  • 抗锯齿已启用,我正在绘制整个字符串。
  • QPainter 是否绘制到 QWidget 上?如果是这样,请先尝试绘制到启用抗锯齿的 QImage,然后将生成的 QImage 绘制到 QWidget(直接绘制到 QWidget 时,抗锯齿提示并不总是有效)。
  • @G.M.,这就是我目前的做法;首先绘制到 QImage,然后将 QImage 绘制到小部件。

标签: c++ qt qpainter


【解决方案1】:

我从this Qt bug ticket 找到了解决方法。简而言之,解决方法是将文本绘制为QPainterPath,而不是文本。

修复示例是

// Do this
QPainterPath glyphPath;
glyphPath.addText( x, y, painter.font(), text );
painter.fillPath( glyphPath, painter.pen().color() );
// instead of this
painter.drawText( x, y, text );

编辑:

区别如下。

之前

之后

【讨论】:

  • 您能在结果中添加一张图片吗?我很好奇这种变通办法提供了多少改进。
猜你喜欢
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多