2017-03-03 22 views
0

私はQPainter変換を設定するうえで混乱しています。私はQtドキュメントを読んだことがありますが、脳炎が進行中です。QWidget/QPainter論理スクリーン座標変換

void MyWidget::paintEvent (QPaintEvent *) { 
    QPainter painter (this); 
    // ... 

論理座標で記述されたシーンをレンダリングします。シーンにはレンダリングされる矩形である「ステージ」が含まれます。ステージは論理座標で指定されます。ビューポートを有していなければならないウィジェットは

  • ステージの限界を超えることなく、可能な限り大きい、そして
  • 段階と共通の中心を有する(正しい用語は?ということです)。上記の状況で

enter image description here

ステージは、私が変換を設定し、

painter.drawText (1.2, 2.2, "abc"); 

を呼び出す場合、それはで表示されます

QRectF stage_rect (QPointF(0.2,5.1), QPointF(6.5,1.9)); 

のようなものによって説明されるだろう上記のようにウィジェットの左下に表示されます。つまり、論理座標が上に上がり、フルステージの高さがウィジェットに表示され、アスペクト比を維持するためにステージが横に切り取られます(ウィジェットが広すぎる/短すぎる可能性がありますが、ステージが垂直に切り取られる可能性があります)。

QPainterにどのような変換を適用して、ウィンドウをステージにしっかりと収める必要がありますか?

答えて

1

Qtの座標系は、上向きで右向きではなく、右向きの正の方向を持っています。これはあなたが望むものです。これを行うには、トランスフォームのYスケール係数を-1に、Xスケール係数を1に設定します。それはY座標を反転しますが、Xは反転しません。しかし、その変換をペインタに適用すると、テキストが逆さまになってしまいます。その代わりに、座標を変換して、変換された座標をペインタに渡すことをお勧めします。

+0

最後の点に追加するには:記述した変換で 'QTransform'オブジェクトを使用し、' map() 'メソッドを使って' QPointF'などの値を扱うことができます –

+0

ありがとうございました。優れた点。 – goug

関連する問題