2017-03-06 8 views
0

私はノードグラフを作成しています。シーン内の空きスペースをクリックし、中マウスをドラッグしてシーン内の現在選択されているアイテムを選択解除せずに移動できるようにします。助言がありますか?中マウスのクリックがQGraphicsSceneの項目をシーン内の項目からブロックせずに選択を解除する方法を教えてください。

ビューのmousePressEventで中クリックをブロックして正しい動作を得ることができますが、シーン内のアイテムに作用する中マウスのクリックイベントがなくなります。シーン内の項目をクリックすると、中クリックが1つの選択になっても構いませんが、シーン内の空のスペースをミドルクリックすると、選択が変更されることはありません。私は、問題は、私はPyQtは/ PySideを使用しています同じ

だろうと仮定して、私はeventFilterを使用しようとしなかったPyQt. How to block clear selection on mouse right click?

これは私が探しています、より複雑な動作をカバーしていません、FWIW。

私は自分の回避策を公開する前に、正しい方法または少なくとも他の回避策のアイデアを投稿すると思いました。

いくつかの回避策のアイデア:

  • ブロックのシーンにmousePressEventが、直接
  • それを実現しながら、シーンにmousePressEventで、まだ選択を復元するために子項目を反復処理。おそらくスケールでのパフォーマンスは悪いですが、単純です。

フィードバックは素晴らしいです!

[編集:] ここは私の答えのpythonバージョンです。コードがテストされました。私QGraphicsScene派生クラスでは:それは中央のマウスクリックだ場合、あなたのQGraphicsScene::mousePressEvent派生実装で

def mousePressEvent(self, event): 
    # Prevent the QGraphicsScene default behavior to deselect-all when clicking on 
    # empty space by blocking the event in this circumstance. 
    item_under_the_mouse = self.itemAt(event.scenePos()) 
    if event.button() == QtCore.Qt.MidButton and not item_under_the_mouse: 
     event.accept() 
    else: 
     super(GraphScene, self).mousePressEvent(event) 

答えて

1

、マウスクリックの下の項目を確認してください。何もない場合は、イベントを受け入れ、基本クラスの実装を呼び出さないでください。何かがクリックの下にある場合は、基本実装を呼び出します。自分で再実装しようとする必要はありません。

void MyScene::mousePressEvent (QGraphicsSceneMouseEvent *evt) 
{ 
    if ((evt->buttons() & Qt::MidButton) && items (evt->scenePos().count()) 
    { 
     QGraphicsScene::mousePressEvent (evt); 
    } 
    else 
    { 
     evt->accept(); 
    } 
} 

acceptこの場合やないで必要とされている場合、私はわからない:私はこれが一般的な考え方だと思います。私はこれを編集したりテストしたりしていませんが、うまくいけば、正しい方向に進むことができれば助かります。

+0

これは私が向かっていた方向です。喜んで確認を確認してください。私はそれが動作するようになると私はPythonのバージョンを投稿します。 – Rafe

+0

優れています...私はPythonを知らないが、回答で前後に変換するのはかなり簡単だとわかっている。 – goug

関連する問題