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

时间:2011-11-03 13:28:08

标签: qt antialiasing qpainter

我使用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上运行时我没有遇到同样的问题。 This FAQ article似乎建议Qt查看主机操作系统来处理字体抗锯齿,那么Windows在处理这种特定字体的渲染时会遇到什么样的问题(这是一种TrueType,就像Arial一样)?

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

  

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

一个“猜测”与您的RenderHint有关。您在此处使用QPainter::Antialiasing。 Docu:“表示如果可能,引擎应该对原语的边缘进行抗锯齿。”像行,rects等原语。请尝试QPainter::TextAntialiasing

注意:RenderHints是标志,因此如果需要,你可以对它们进行bit-OR(听起来像是这样)。