8

我曾经QPainter::setRenderHint(QPainter::Antialiasing, true)告诉 Qt 我希望它对我所做的任何绘图进行抗锯齿处理(在这种情况下,使用 绘制的文本drawText())。

这工作正常,文本看起来不错,直到我想旋转我正在绘制的像素图,例如

Painter.translate(0, height());
Painter.rotate(-90);

(将 QPainter 逆时针旋转 90 度并将其重新显示)

调用rotate()似乎对绘制的任何文本禁用抗锯齿 - 文本以正确的旋转绘制但没有抗锯齿。其他事情似乎不受影响 - 例如drawLine()仍然画出很好的抗锯齿线。

知道我做错了什么吗?

编辑:毫不奇怪,将文本添加到路径然后填充该路径会给我抗锯齿、旋转的文本。如果可能的话,我宁愿避开这条路线。

编辑(再次):我尝试过使用QFont::setStyleStrategy(QFont::PreferAntialias)我正在使用的字体,但没有效果。然而,更多的实验表明,像 Arial 这样的基本字体在旋转时仍会产生抗锯齿文本,而我的自定义字体(对于任何感兴趣的人来说,Swiss721 BlkCn BT)不会。此外,虽然这个问题在 Windows 7 上存在,但在 Ubuntu 上运行时我没有同样的问题。这篇 FAQ 文章似乎暗示 Qt 依靠主机操作系统来处理字体抗锯齿,那么 Windows 在处理这种特定字体(它是 TrueType,就像 Arial 一样)的呈现时可能会遇到什么样的问题?

编辑(最后一次,我保证):将字体大小增加到 16pt 或以上可以解决问题。似乎问题在于将我的特定字体渲染到 16pt 以下 - 可能与上述博客文章中提到的内容有关?:

在 Windows 2000 上,字体通常不会在一定范围内(例如 8-16 号)进行抗锯齿处理,以使文本更加清晰易读。

4

2 回答 2

4

实际上,我最近有机会参与 Qt 代码的这一部分,我认为您看到的行为与 Qt 中的以下两个错误有关:

如果我没记错(不是 100%)肯定,您实际看到的是 Windows 上 ClearType 渲染的丢失。当应用了转换时,Qt 以一种抛出 ClearType 信息的方式获取字形像素,因此事情看起来更加参差不齐。

如果您想自己查看代码,最有可能的地方是/src/gui/text/qfontengine_win.cpp. 您也可以尝试关闭 ClearType 并查看它们是否相似。

于 2011-11-03T19:14:40.940 回答
0

一个“猜测”与您的 RenderHint 有关。你QPainter::Antialiasing在这里用。文档:“指示引擎应尽可能消除基元边缘的锯齿。” 像线条、矩形等基元。试试吧QPainter::TextAntialiasing

注意:RenderHint 是标志,因此您可以根据需要对它们进行位或运算(听起来确实如此)。

于 2011-11-03T16:02:34.177 回答