7

我想使用 绘制文本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();
}

产生以下结果:

在此处输入图像描述

前者显然更干净、更好,尤其是在较小的字体中。我应该怎么做才能得到相同的结果QPainterPath

我正在使用 Qt 5.0 的 Windows 7 计算机上生成上述结果。

4

3 回答 3

5

根据将文本添加到 QPainterPath 的 Qt 文档:-

将给定文本作为一组从提供的字体创建的封闭子路径添加到此路径。

所以这里发生了转换,这就是为什么它看起来不一样。如果您需要旋转文本,您可以尝试在渲染之前旋转 QPainter,然后再将其恢复。或者,如果您可以使用 QGraphicsView 和 QGraphicsDisplay 而不仅仅是渲染到小部件上,那么 QGraphicsTextItem 类可能会有所帮助。

但总的来说,导致文本质量不同输出的是向封闭子路径集的转换。

于 2013-07-24T12:36:42.660 回答
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();

我承认 QPainterPath text "Hello World 3" 比 QPainterText "Hello World 1" 丑一点,但结果还是比 "Hello World 2" 好

在此处输入图像描述

于 2017-02-10T16:16:06.913 回答
0

我希望与上述答案有所不同,并建议 addText/drawPath 和 drawText 方法做同样的事情,并且可能没有实质性的“转换”。

正如 Mehdi-Antoine 所指出的 - 使用 drawText 会产生中等大小的文本权重,而使用带有 Pen 和 Brush 的 addText/drawPath 会产生较重的权重,而仅使用带有填充的 addText/drawPath 会产生较轻的权重。

请注意,QPen 值有一个宽度,默认为 1,如果您使用此笔以宽度为 1 来描边文本的轮廓,则文本将显得非常沉重,如 Medhi-Antoine 的示例所示。

但是 - 您可以通过使用 addText/drawPath 方法实现与 drawText 有效相同的结果,只需调整所用 Pen 的权重即可。对于 30 磅的字体大小,Arial,将 Pen 宽度设置为 0.2,然后使用 addText/drawPath 方法进行绘画似乎创建了与 drawText 方法相同的东西。

似乎 drawText 方法采用 Pen 的颜色,然后使用它进行填充,然后以特定厚度应用笔画。

如果你要使用 drawPath 方法,你必须为机器人提供 Fill 和 Pen,重要的是,适当地调整画笔的宽度。

于 2021-09-02T02:37:30.820 回答