2011-11-03 222 views
6

我使用QPainter::setRenderHint(QPainter::Antialiasing, true)来告诉Qt,我希望它能够抗锯齿我所做的任何绘图(在这种情况下,使用drawText()绘制的文本)。QPainter :: rotate禁用绘制文本的抗锯齿

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

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

(以90度逆时针旋转的QPainter并把它放回视图)

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

任何想法我做错了什么?

编辑:不出所料,将文本添加到路径,然后填充该路径给我antialiased,旋转文本。如果可能的话,我宁愿避免这条路线。

编辑(再次):我试过在我使用的字体上使用QFont::setStyleStrategy(QFont::PreferAntialias),没有任何效果。但是,一些更多的实验表明,像Arial这样的基本字体在旋转时仍然会产生反锯齿文本,而我的自定义字体(任何感兴趣的人都可以使用Swiss721 BlkCn BT)不会。此外,虽然Windows 7上存在此问题,但在Ubuntu上运行时,我没有遇到同样的问题。 This FAQ article似乎暗示Qt会向主机操作系统寻找字体抗锯齿处理,所以Windows在处理这种特定字体(这是一种TrueType,就像Arial)的渲染时可能会遇到什么样的问题?编辑(上次,我保证):将字体大小提高到16pt或更高可以消除问题。看起来问题在于将我的特定字体呈现在16pt以下 - 可能与上述博客文章中提到的有关:

在Windows 2000上,字体通常在特定范围内不会反锯齿大小8-16),使文本更清晰可读。

+0

我想我可能在这里回答了我自己的问题,但如果有人有任何进一步的或相关的信息,我仍然会很感兴趣。 – sjwarner

回答

2

其实我已经有机会在Qt的这部分代码最近,我想您所看到的行为与以下两个错误Qt中:

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

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

+1

这让Dave很有意义,谢谢。关闭cleartype确实会导致在旋转时使用相同的像素绘制字符。 [This forum thread](http://forum.xda-developers.com/archive/index.php/t-280037.html)(特别是Ingvarr的评论)以及[Wikipedia article](http:///en.wikipedia.org/wiki/Cleartype#How_ClearType_works)解释了如何使ClearType工作的基本原理也限制它只能使用水平文本。 – sjwarner

0

一个“猜测”涉及你的RenderHint。您在这里使用QPainter::Antialiasing。 Docu:“表示如果可能的话,引擎应该在基元的抗锯齿边缘。”原始材料,如线条,矩形等尝试使用QPainter::TextAntialiasing

注意:RenderHints是标志,所以如果需要的话,你可以对它们进行位或者(或者听起来就是这样)。

+0

没有运气我很害怕罗宾,不过谢谢。 – sjwarner