【发布时间】: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 绘制到小部件。