2013-02-05 8 views
0

마우스 이벤트를 장면에 첨부하는 방법을 찾을 수 없습니다. Without View 모든 이벤트가 적용되지만, 주석 처리 된 경우 mousePressEvent 만 작동합니다. 도와주세요.Pyside QgraphicsScene에서 마우스 이벤트를 캡처 할 수 없습니다.

from PySide import QtGui, QtCore 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.Scene() 
     self.View() 

    def mousePressEvent(self, event): 
     if event.button() == QtCore.Qt.LeftButton: 
      print "Pressed!!!" 

    def mouseMoveEvent(self, event): 
     print "moving....." 

    def mouseReleaseEvent(self, event): 
     print "-------released" 

    def Scene(self): 
     self.s = QtGui.QGraphicsScene(self) 

    def View(self): 
     self.v = QtGui.QGraphicsView(self.s) 
     self.setCentralWidget(self.v) 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(300, 200) 
    window.show() 
    sys.exit(app.exec_()) 
+1

나는 당신의 목표가 무엇인지 모르겠습니다. 'QGraphicsView'를 중앙 위젯으로 놓고 클릭하면 뷰는 부모 ('QMainWindow')가 아닌 마우스 이벤트를 얻을 것입니다. 그건 정상입니다. – Avaris

+0

하지만 그 반대입니다. View는 위에서 쓴 것처럼 mousePressEvent 만 허용하고 다른 것은 무시합니다 (mouseMoveEvent, mouseReleaseEvent). – Alex

+1

아니요.'QMainWindow'에 대해'mouse * Event' 메소드를 정의하고 있습니다. 그것들로부터'print'를 보게되면, 그 이벤트는 뷰가 아닌'QMainWindow'에서 _ 생합니다. 뷰와 함께'pressed '된 것을 보는 이유는'QGraphicsView'에서의 이벤트의 기본 구현에 달려 있습니다. view와 함께 아무것도 할 수 없다면 view는 무시하고 부모에게 전달한다. – Avaris

답변

4

Qt에서 이벤트는 자식에서 부모로 처리됩니다. 먼저 자식이 이벤트를 가져옵니다. 그런 다음 이벤트를 처리할지 여부를 결정합니다. 행동을 원하지 않으면 ignore 이벤트와 이벤트가 부모에게 전달됩니다.

설정에서 부모로 QMainWindow, 하위로 QGraphicsView이 있습니다. QGraphicsView의 모든 이벤트는 먼저 QGraphicsView에 의해 처리됩니다. 이벤트를 원하지 않으면 ignore이되며 QMainWindow으로 전달됩니다.

이 더 나은 서브 클래스 QGraphicsView 그것을 시각화하고 mouse*Event의 무시하려면 :

from PySide import QtGui, QtCore 

class View(QtGui.QGraphicsView): 
    def mousePressEvent(self, event): 
     print "QGraphicsView mousePress" 

    def mouseMoveEvent(self, event): 
     print "QGraphicsView mouseMove" 

    def mouseReleaseEvent(self, event): 
     print "QGraphicsView mouseRelease" 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.Scene() 
     self.View() 

    def mousePressEvent(self, event): 
     print "QMainWindow mousePress" 

    def mouseMoveEvent(self, event): 
     print "QMainWindow mouseMove" 

    def mouseReleaseEvent(self, event): 
     print "QMainWindow mouseRelease" 

    def Scene(self): 
     self.s = QtGui.QGraphicsScene(self) 

    def View(self): 
     self.v = View(self.s) 
     self.setCentralWidget(self.v) 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(300, 200) 
    window.show() 
    sys.exit(app.exec_()) 

을 그리고 당신은 같은 출력을 볼 수 있습니다 : 당신이 볼 수 있듯이

QGraphicsView mousePress 
QGraphicsView mouseMove 
... 
QGraphicsView mouseMove 
QGraphicsView mouseRelease 

을 만 view는에 도착 view은 이벤트를 전달하지 않기 때문에 이벤트를 '확인'하십시오.

또는 QGraphicsView에서 해당 이벤트를 무시하도록 선택할 수 있습니다. 그것은 '나는 이것으로 아무 것도하지 않고, 다른 누군가가 돌보게해라.'라고 말하는 것과 같습니다.

class View(QtGui.QGraphicsView): 
    def mousePressEvent(self, event): 
     print "QGraphicsView mousePress" 
     # ignore the event to pass on the parent. 
     event.ignore() 

    def mouseMoveEvent(self, event): 
     print "QGraphicsView mouseMove" 
     event.ignore() 

    def mouseReleaseEvent(self, event): 
     print "QGraphicsView mouseRelease" 
     event.ignore() 

그리고 출력 :

QGraphicsView mousePress 
QMainWindow mousePress 
QGraphicsView mouseMove 
QMainWindow mouseMove 
... 
QGraphicsView mouseMove 
QMainWindow mouseMove 
QGraphicsView mouseRelease 
QMainWindow mouseRelease 

지금, 당신은 view 먼저 이벤트를 얻을 수 있음을 알 수는 무엇을 선택하는 이벤트가 부모에게 전달됩니다. 그러나 그것은 ignore 이벤트이므로 메인 윈도우로 전달되고 그 후에 만 ​​QMainWindow이 신호를받습니다.

길게만 짧음, 염려하지 마십시오. view은 이벤트를 수신하고 정상적으로 작동합니다.