2009-07-13 16 views
14

QT 4.5でペイントプログラムを実行しようとしています。そのため、QGraphicsViewをキャンバスに、QGraphicsSceneを使用してアイテムを保存しています。私はQWidgetの子のようにDrawingCanvasを変更した場合、いくつかの理由から、私はちょうど、QT 4.5 - QGraphicsViewでQPainterデバイスを取得するには

class DrawingCanvas : public QGraphicsView 
{ 
    DrawingCanvas::DrawingCanvas(QWidget * parent); 

... 
}; 

DrawingCanvas::DrawingCanvas(QWidget * parent = 0) : QGraphicsView(parent) 
{ 
    .... 
} 

void DrawingCanvas::paintEvent(QPaintEvent& paintEventInfo) 
{ 
    // Result in painter not active 
    QPainter(this); 
    ... 
} 

しかし私自身の派生QGraphicsViewにQPainterのコンテキストを取得できませんでした、それが動作します。 QGraphicsViewがQAbstractScrollArea、次にQFrame、そしてQWidgetから派生しているのを見て、私はコードがうまくいくと期待しています。

だから私は、質問があると思います:なぜ私はアクティブQPainterのを取得するためにQGraphicsViewでpaintEventを使用することができないということです)

1? 2)私は1つを得ることができる可能性はありますか?

ありがとうございます!

答えて

15

誰かがまだ何らかの形で可能かどうか疑問に思うなら、答えははいです。

ショートバージョン

void DrawingCanvas::paintEvent(QPaintEvent& paintEventInfo) 
{ 
    // Result in painter active 
    QPainter(viewport()); 
    ... 
} 

ロングバージョン

QGraphicsSceneは、それ自体でペイントを行いませんが、代わりにあなたがそれを与えるかによって、QWidgetのデフォルトビューポートウィジェットにペイント。

代わりにビューポートでペイントすることで、シーンではなくビューに揃えるオーバーレイされたペインティングを実現できます。あるいは、QGlWidgetとそのpaintOverlayGl()を使用することもできます。

また、viewportUpdateMode(QGraphicsView :: FullViewportUpdate)を設定することを忘れないでください。そうしないとレンダリング成果物が得られません。毎回ビュー全体を更新するよりも、パフォーマンス上の問題に遭遇するまで、アーティファクトを回避するよりスマートな方法があります。

4

私の髪をしばらく引き出した後、これは不可能と思われるので、私の解決策です。描画するものはすべてQGraphicsSceneに追加する必要があります。あなたはそれから独自の実装を導き出します。

最も簡単な方法は、描画する線、矩形などの一時的なQGraphicsItemポインタを定義することです。

仮想mousePressed()、mouseMove()およびmouseRelease()イベントをそれに応じてオーバーライドします。 mousePressed()で、temp QGraphicsItemポインターを初期化し、シーンに追加します。

mouseMoved()の内部では、temp QGraphicsItemの座標をそれに応じて設定します。 mouseReleasedの場合は、tempオブジェクトのコピーを作成してシーンに追加し、シーンから線、矩形などを描画するために使用していたtemp QGraphicsItemを削除します。

これは、QGraphicsView内にQPainterコンテキストがなく、そのpaintEvent()を無視する方が良いということです。

これは、これを遭遇する可能性のある人に役立ちます。

+1

私はちょうどこの全く同じプロセスを経験しました。<あなたは彼らが一時的なアイテムをはるかに簡単に描くように思うでしょう。 もう1つの解決策があります...オーバーコーティング。本当にしたい場合は、不可視のウィジェットを重ねてペイントすることができます。 – mpen

1

もう1つの可能性があります。ビュー上でdrawForegroundを上書きします。描画する必要があるアイテムの種類によって、これは非常に簡単な解決策(マーカー線のオーバーレイなど)である場合もあれば、シーン内でカスタムアイテムを作成する場合よりも多くの場合に作用します。

関連する問題