QPainter :: rotate禁用绘制文本的抗锯齿

sam*_*m-w 8 qt antialiasing qpainter

我用它QPainter::setRenderHint(QPainter::Antialiasing, true)来告诉Qt我希望它能解决我做的任何绘图(在这种情况下,绘制的文本drawText()).

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

Painter.translate(0, height());
Painter.rotate(-90);
Run Code Online (Sandbox Code Playgroud)

(将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)进行抗锯齿处理,以使文本更清晰可读.

Dav*_*eer 4

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

如果我没记错的话(不是 100%),您实际上看到的是 Windows 上 ClearType 渲染的丢失。当应用转换时,Qt 以抛出 ClearType 信息的方式获取字形像素,因此事物看起来更加锯齿状。

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