来自QPainter的文本比QPainterPath好得多

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计算机上生成上述结果.

The*_*ght 5

根据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" 好

在此处输入图片说明