[PySide] GraphicsViewで遊ぼう その2 間に線を引く

前回に続いて今回もGraphicsView
間に線を引いたり、クリックで増殖したりできるようにしてみました。

長いけど全コード。

前回のとだいたい同じですが、
それに+して2つのノードの間を描画するためのItemを作成しました。

cap_view_2
Lineクラスは、2つのノードオブジェクトを受け取るとその2つの間に線を描画します。
このLineは、ノードが動くごとに再描画しないと初期の状態から動かなくなってしまいます。
そのため、LINEクラスは受け取ったオブジェクトにLINEオブジェクトをセットしてやり
オブジェクトが動いた時にLINEのスタート・エンドポイントを更新するような構造にする必要があります。

オブジェクトが動く→スタートエンドの座標位置が更新→再描画
のような順序になっています。

この構造にするためなのか weakref という弱参照を実現するためのモジュールを使用しているのですが
サンプル見ても説明みてもなんで必要なのか、そもそも弱参照とはなんぞ?というのがさっぱり分かりません。
けど使わないと動かない…もっとこのあたりは勉強が必要かなと思います。

paintで描画する部分を定義していますが、この描画領域を設定しているのが boundingRect(たぶん)
そのためか、QGraphicsItemを継承してオブジェクトを作成する場合
boundingRectが定義されていないと、オブジェクトが描画されませんでした。
では、オブジェクトを選択するための領域はどうやって指定するのだろう?
boundingRectで指定した四角でしかだめなのだろうか?
と、思っていたのですが、
それを指定しているのが shape 関数のようです。
QtGui.QPainterPath() でShapeを指定してreturnで返すと、その領域がオブジェクトの領域になるようです。
今回は円指定にしていますが、Polygon(多角形)を指定する事も出来ます。
四角以外のボタンを作りたい場合は、 paintで描画+shapeで形状指定してやればやりたい事は実現出来そうですね。

クリックしたときにオブジェクトを増やすあたり。
mouseDoubleClickeEvent() 関数で、ダブルクリックをするとオブジェクトを作成するようにしています。
クリックした時に、オブジェクトはマウス下にでるようにしたい場合
event.pos() で、いまのマウスポジションを取得できるのですが
ScenesRectは、中央が0指定となるため、setSceneRect で指定した数字分マイナスしてあげないとダメでした。

オブジェクトのソート。
複数のオブジェクトがある場合、オブジェクトのzValueによってソートが決定されます。
(数字が大きい方が前)
今回のテストの場合、LINEはオブジェクトより後ろに置いておきたいので1に指定しています。

 

やっぱり描画周りは難しいですなぁ…

コメントを残す

メールアドレスが公開されることはありません。


*