2017-03-06 11 views
0

노드 그래프를 만들 때 장면의 빈 공간을 클릭하고 장면에서 현재 선택된 항목의 선택을 취소하지 않고 가운데 마우스 드래그하여 탐색 할 수 있기를 원합니다. 어떤 제안?중간 마우스 클릭이 QGraphicsScene의 항목을 장면의 항목에서 차단하지 않고 선택을 취소하는 방법?

보기의 mousePressEvent에서 중간 클릭을 차단하고 올바른 동작을 얻을 수 있지만 장면의 항목에 대해 중간 마우스 클릭 이벤트가 더 이상 작동하지 않습니다. 장면에서 항목을 클릭 할 때 중간 클릭을 한 번만 선택하면 좋겠지 만 장면의 빈 공간을 중간 클릭하면 선택 항목을 변경하지 않으려 고합니다. 나는 문제가 나는 PyQt는/PySide를 사용하고 같은

것이다 가정으로 PyQt. How to block clear selection on mouse right click?

내가 eventFilter를 사용하려고하지 않았다

내가 찾고 있어요 더 복잡한 동작을 포함하지 않았다 , FWIW.

나 자신의 해결 방법을 롤업하기 전에 올바른 방법이나 적어도 다른 해결 방법을 위해 여기에 게시 할 것이라고 생각했습니다.

일부 해결 아이디어 :

  • 블록 장면에 mousePressEvent하지만 직접
  • 를 제공하는 동안 현장에서 mousePressEvent 여전히 선택을 복원 하위 항목을 반복. 아마도 규모면에서는 성능이 좋지 않을 지 모르겠지만 간단합니다.

모든 의견이 훌륭합니다!

[편집 :] 여기 내 대답은 파이썬 버전입니다. 코드가 테스트되었습니다. 내 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

, 마우스 클릭 아래 항목을 확인합니다. any가 없으면 이벤트를 승인하고 기본 클래스 구현을 호출하지 마십시오. 무언가가 클릭 아래에 있다면 기본 구현을 호출하십시오. 당신은 자신을 다시 구현하려고 노력하지 않아도됩니다.

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

accept이 경우 여부에 필요한 경우 잘 모르겠어요 :이 일반적인 생각이라고 생각합니다. 나는 이것을 컴파일하거나 테스트하지는 않았지만, 올바른 방향으로 갈 수있게 해주시면 도움이 될 것입니다.

+0

이것은 내가 향하고있는 방향입니다. 다행이 확인을 참조하십시오. 파이썬 버전을 게시하면 일단 작동합니다. – Rafe

+0

우수 ... 파이썬을 모르지만 답변에서 앞뒤로 쉽게 변환 할 수 있습니다. – goug