2

私は Qt の初心者QPainterで、次のテスト コードを使用して描画を試みています。

QPixmap pixmap(20, 20);
pixmap.fill(Qt::white);
QPainter painter(&pixmap);

// Draw a rectangle (works fine in both Qt4 and Qt5)
painter.setPen(Qt::blue);
painter.drawLine(0, 0, 10, 0);
painter.drawLine(0, 0, 0, 10);
painter.drawLine(10, 0, 10, 10);
painter.drawLine(0, 10, 10, 10);

// Draw an example line from official docs (broken in Qt5)
painter.setPen(Qt::darkGreen);
painter.drawLine(2, 7, 6, 1);

// Draw an X (broken in Qt5)
painter.drawLine(13, 13, 18, 18);
painter.drawLine(13, 18, 18, 13);

どういうわけか、Qt4 (4.8.4) と Qt5 (5.0.1、5.0.2) ではまったく異なる結果が得られます。

Qt5が独自の公式ドキュメントに記載されているルールに従っているようには見えません。ただし、新しいQPainter::Qt4CompatiblePaintingレンダー ヒントがあります。設定すると、実際に Qt4 と同じ結果が得られます。

だから私の質問は:

  • 新塗装ルールって実際どうなの?
  • これらの新しいルールのドキュメントはどこにありますか?
  • 画像の右下にある「X」が Qt5 で対称でないのはなぜですか?
4

1 に答える 1

1

そこで、Qt トラッカーでバグを開いたところ、Gunnar Sletta から次の応答がありました。

Qt 5 でラスター化ルールが改善され、一貫性が保たれたのは正しいことです。アンチエイリアス処理されたグラフィックスのレンダリング方法と一貫性が保たれています (これは常に正しい方法でした)。Qt 4 では、エイリアシングされたグラフィックスは常に 0.5 ずつずれていて、さまざまな問題が発生していました。それに応じてドキュメントを更新する必要があります。すべての右下シフト ロジックは、Qt4 互換モードにのみ適用されます。

QPen のデフォルトのキャップ スタイル (端点の描画方法) は Qt::SquareCap です。これは、線が各方向に 0.5 ピクセル長くなり、合計で 1 ピクセルが下に着地することを意味します。キャップ スタイルを FlatCap に設定すると、余分なピクセルが削除されます。

私のさらなる実験では、ペン スタイルを に設定するだけQt::FlatCapでは不十分であることがわかりました。それでも、(他の種類の) いくつかの問題が残ります。現在、互換性フラグなしで Qt4 のような結果を取得する正しい方法は、整数の代わりに浮動小数点座標を使用し、すべての終点に 0.5 を追加することです (線のスタイルを設定せずに)。Qt::FlatCap例えば:

painter.setPen(Qt::darkGreen);
painter.drawLine(QPointF(2.5, 7.5), QPointF(6.5, 1.5));

これを完全に自動化する簡単な方法は、ペインターを作成した後に次の呼び出しを行うことです。

painter.translate(0.5, 0.5);
于 2013-06-10T08:39:47.603 に答える