qt - QPainter ::以非垂直角度旋转会产生波浪线

时间:2017-09-25 11:02:49

标签: c++ qt qpainter

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

在下图中,我正在绘制45度角的文字线条。第一行文本是许多下划线(“_____”),第二行文本是“多线程”。在这里绘制下划线而不是一条线只是为了突出问题。

enter image description here

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

以垂直角度(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();
}

1 个答案:

答案 0 :(得分:3)

我找到了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 );

修改

差异可以在下面看到。

之前

Before, buggy text

After, correct text