2011-11-16 59 views
2

QGraphicsViewがあり、QGraphicsSceneと表示されています。ユーザーは、ボタンを使用してシーンをズームおよびパンすることができます。この操作は、scale()などのQGraphicsView関数で実現されます。 ここでは、透明なピックスマップを描画したいと思います。このピクセルマップは、ユーザーの操作によって変形されません。 graphicsViewと別の場所に置くにはどうすればよいですか?Qt GraphicsScene:新しいレイヤーを作成する方法は?

答えて

6

あなたがシーン変換の完全独立してQGraphicsView上に描画するために何かをしたい場合、あなたはQGraphicsViewのサブクラスを作成し、それらのアイテムを描くことができます(オーバーライドされた)paintEventメソッドの一部として

void MyView::paintEvent(QPaintEvent *event) { 
    // Call the base paintEvent to do the "normal" stuff. 
    QGraphicsView::paintEvent(event); 

    // Paint your other stuff. Note that you have to create the QPainter on 
    // the viewport. 
    QPainter painter(viewport()); 
    painter.setBrush(QBrush(Qt::black)); 
    // ... etc. 
} 
+0

残念ながら、ビューがスクロールされても機能しません。ビュー全体を無効にする変換にのみ適しています。 – ybungalobill

2

スケールを適用したくないpixmapアイテムにQGraphicsItem::ItemIgnoresTransformationsフラグを追加できます。

項目は継承された変換(すなわち、その位置は まだ親に固定されているが、親またはビューの回転、ズーム又は 剪断変換が無視される)を無視します。このフラグは、 のテキストラベル項目を水平にして、スケーリングしないようにするのに便利です。したがって、ビューが変形されても、 が表示されます。設定すると、アイテムのビュー のジオメトリとシーンのジオメトリは個別に管理されます。 ビューで座標をマップし、衝突を検出するためにdeviceTransform()を呼び出さなければなりません。デフォルトでは、このフラグは無効です。このフラグは Qt 4.3で導入されました。注:このフラグを設定すると、項目自体の縮尺を変更することができます。 となり、その尺度変換が項目の子に影響します。

はそれを行うためsetFlag機能を使用します。

pixmapItem->setFlag(QGraphicsItem::ItemIgnoresTransformations); 
+0

このフラグは、GraphicsViewが、たとえばensureVisible()などでアイテムから離れて見えることを防ぎません。 –

+0

このフラグは、ビューが拡大縮小された場合にのみアイテムに影響します。シーンパニングを処理するフラグはありません。このフラグ以外のオブジェクトを常に同じ位置に表示したい場合は、シーンの再描画が行われるたびにこれらのアイテムのsetPosを明示的に呼び出す必要があります。 – pnezis

0

私はDaveの答えが好きです。良い方法になる単純なHUDのために。しかし、サブクラス化や手動ペイントなしで、このようなことを行うことができます.2つのシーンと2つのビューを作成し、それらをQGridLayoutの同じ場所に重ねて配置するだけです。したがって、あなたは2つの完全に独立した "レイヤー"を望み通りに持っています。

関連する問題