qt - QPainter ::以非垂直角度旋转会导致扭曲的线条
问题描述:
我试图在非垂直角度(即0和90之间)的角度上绘制小部件上的文本。绘制文本本身不存在问题,但由此产生的文本是非常曲折/不均匀的绘制。qt - QPainter ::以非垂直角度旋转会导致扭曲的线条
在下面的图片中,我正在以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();
}
答
我发现一种解决方法从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);
编辑:
的差别在下面可以看到。
之前:
后:
你可以尝试使用抗锯齿? –
你一次画字符,还是字符串? – Yakk
Antialiasing已启用,并且正在绘制整个字符串。 – edvardsp