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

Qt QPaint::rotate禁用绘制文本的抗锯齿,qt,antialiasing,qpainter,Qt,Antialiasing,Qpainter,我使用QPainter::setRenderHint(QPainter::antialasing,true)告诉Qt我希望它对我所做的任何图形进行抗锯齿处理(在本例中,使用drawText()绘制的文本)) 这很好,文本看起来也不错,直到我想旋转我正在绘制的像素地图 Painter.translate(0, height()); Painter.rotate(-90); (将QPainter逆时针旋转90度并使其回到视野中) 调用rotate()似乎会禁用绘制的任何文本的抗锯齿-文本以正确的旋

我使用
QPainter::setRenderHint(QPainter::antialasing,true)
告诉Qt我希望它对我所做的任何图形进行抗锯齿处理(在本例中,使用
drawText()绘制的文本)

这很好,文本看起来也不错,直到我想旋转我正在绘制的像素地图

Painter.translate(0, height());
Painter.rotate(-90);
(将QPainter逆时针旋转90度并使其回到视野中)

调用
rotate()
似乎会禁用绘制的任何文本的抗锯齿-文本以正确的旋转方向绘制,但没有抗锯齿。其他东西似乎没有受到影响-例如,
drawLine()
仍然绘制了一条很好的抗锯齿线

知道我做错了什么吗

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

编辑(再次):我尝试在我使用的字体上使用
QFont::setStyleStrategy(QFont::PreferAntialias)
,但没有效果。然而,更多的实验表明,像Arial这样的基本字体在旋转时仍然会产生抗锯齿文本,而我的自定义字体(感兴趣的人可以使用Swiss721 BlkCn BT)不会。此外,虽然这个问题在Windows7上存在,但我在Ubuntu上运行时没有同样的问题。这似乎表明Qt指望主机操作系统来处理字体抗锯齿,那么Windows在处理这种特殊字体(与Arial一样是TrueType)的呈现时会遇到什么样的问题呢

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

在Windows 2000上,字体通常不会在一定范围内消除锯齿(例如大小8-16),以使文本更清晰易读

一个“猜测”与你的RenderHint有关。您可以在此处使用
qPaint::抗锯齿。Docu:“表示引擎应尽可能消除基本体的边缘的锯齿。。”基本体如直线、矩形等。请尝试使用
QPaint::TextAntialiasing


注意:renderInts是标志,因此如果需要,您可以对其进行位或位(听起来像是)。

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

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


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

我想我可能已经回答了我自己的问题,但如果有人有任何进一步的或相关的信息,我仍然非常感兴趣。这很有道理,戴夫,谢谢。关闭cleartype确实会导致在旋转时使用相同的像素绘制字符。(特别是Ingvarr的评论)以及解释ClearType工作的基本原则如何将其限制为仅处理水平文本。