8

私はQPainter::setRenderHint(QPainter::Antialiasing, true)Qtに、私が行うすべての描画(この場合は)で描画されたテキストをアンチエイリアス処理するように指示するために使用しますdrawText()

これは正常に機能し、描画しているピックスマップを回転させたいまで、テキストは見栄えがします。

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

(QPainterを反時計回りに90度回転し、表示に戻すには)

toを呼び出すとrotate()、描画されたテキストのアンチエイリアスが無効になっているようです。テキストは正しい回転で描画されますが、アンチエイリアスは使用されません。他のものは影響を受けていないように見えます-たとえばdrawLine()、それでもうまくアンチエイリアスされた線を描画します。

私が間違っていることについて何か考えはありますか?

編集:当然のことながら、パスにテキストを追加してからそのパスを埋めると、アンチエイリアス処理された回転したテキストが得られます。ただし、可能であればこのルートは避けたいと思います。

編集(再度):使用QFont::setStyleStrategy(QFont::PreferAntialias)しているフォントで使用してみましたが、効果がありません。ただし、さらに実験を重ねると、Arialのような基本フォントは回転してもアンチエイリアス処理されたテキストが生成されますが、私のカスタムフォント(興味のある人はSwiss721 BlkCn BT)は生成されません。さらに、この問題はWindows 7に存在しますが、Ubuntuで実行している場合は同じ問題は発生しません。このFAQの記事は、Qtがフォントのアンチエイリアスを処理するためにホストOSを参照していることを示唆しているようです。したがって、この特定のフォント(Arialと同様にTrueType)のレンダリングを処理する際にWindowsでどのような問題が発生する可能性がありますか?

編集(前回、約束します):フォントサイズを16pt以上に上げると、問題が解決します。問題は私の特定のフォントを16pt未満にレンダリングすることにあるように思われます-おそらく上記のブログ記事で言及されたものと関係がありますか?:

Windows 2000では、フォントは通常、テキストをより鮮明で読みやすくするために、特定の範囲(たとえば、サイズ8〜16)内でアンチエイリアス処理されません。

4

2 に答える 2

4

私は最近、Qtコードのこの部分に実際に参加する機会がありました。あなたが見ている動作は、Qtの次の2つのバグに関連していると思います。

私が正しく(100%ではない)確かに覚えているなら、あなたが実際に見ているのは、WindowsでのClearTypeレンダリングの喪失です。変換が適用されると、QtはClearType情報をスローする方法でグリフピクセルを取得するため、物事はよりギザギザに見えます。

コードを自分で確認したい場合、最も可能性の高い場所は/src/gui/text/qfontengine_win.cppです。ClearTypeをオフにして、同じように見えるかどうかを確認することもできます。

于 2011-11-03T19:14:40.940 に答える
0

1つの「推測」は、RenderHintに関するものです。ここで使用QPainter::Antialiasingします。Docu:「可能であれば、エンジンがプリミティブのエッジをアンチエイリアスする必要があることを示します。」線、長方形などのプリミティブQPainter::TextAntialiasing。代わりに試してください。

注:RenderHintsはフラグであるため、必要に応じてビットORを使用できます(そのように聞こえます)。

于 2011-11-03T16:02:34.177 に答える