Yel*_*low 7 c++ qt qpainter qt5
我想使用绘制文本QPainter,我想先使用QPainterPath(因为最终我想以各种方式旋转文本).但是,我发现生成的文本QPainterPath比生成的文本更加丑陋QPainter.
以下代码:
void MyWidget::paintEvent(QPaintEvent* /*event*/) {
QFont font;
font.setStyleHint(QFont::Times, QFont::PreferAntialias);
font.setPointSize(30);
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(Qt::black);
painter.setFont(font);
painter.drawText(10, 40, "Hello World");
QPainterPath textPath;
textPath.addText(10, 100, font, "Hello world");
painter.drawPath(textPath);
painter.end();
}
Run Code Online (Sandbox Code Playgroud)
产生以下结果:

前者显然更清洁,更好,特别是在较小的字体中.我该怎么做才能得到相同的结果QPainterPath?
我在Qt 5.0的Windows 7计算机上生成上述结果.
根据Qt文档向QPainterPath添加文本: -
将给定文本作为从提供的字体创建的一组封闭子路径添加到此路径.
所以这里有转换,这就是它看起来不一样的原因.如果需要旋转文本,可以尝试在渲染之前旋转QPainter,然后再恢复它.或者,如果您可以使用QGraphicsView和QGraphicsDisplay而不是仅仅渲染到窗口小部件,那么可以使用QGraphicsTextItem类.
但总的来说,它是转换为一组封闭的子路径,负责不同的文本质量输出.
小智 5
这两种字体看起来不一样,因为您正在为 QPainterPath 文本添加额外的轮廓。下面这段代码应该会给出很好的结果:
QFont font;
font.setStyleHint(QFont::Times, QFont::PreferAntialias);
font.setPointSize(30);
QPainter painter;
painter.begin(this);
painter.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing);
painter.setFont(font);
// painter text color is modified by setPen()
painter.setPen(Qt::white);
painter.drawText(10, 40, "Hello World 1");
QPainterPath textPath;
textPath.addText(10, 100, font, "Hello World 2");
// painter path text color is modified by setBrush()
painter.setBrush(Qt::white);
// setPen(Qt::white) add extra white contour on text path (what you did)
painter.setPen(Qt::white);
painter.drawPath(textPath);
QPainterPath textPath2;
textPath2.addText(10, 160, font, "Hello World 3");
// painter path text color is modified by setBrush
painter.setBrush(Qt::white);
// setPen(Qt::NoPen) avoid extra contours for QPainter Path
painter.setPen(Qt::NoPen);
painter.drawPath(textPath2);
painter.end();
Run Code Online (Sandbox Code Playgroud)
我承认 QPainterPath 文本 "Hello World 3" 比 QPainterText "Hello World 1" 丑一点,但结果还是比 "Hello World 2" 好