我正在尝试以非垂直的角度在小部件上绘制文本,即在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();
}
答案 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 );
修改强>
差异可以在下面看到。
之前:
后: