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
은 이벤트를 수신하고 정상적으로 작동합니다.
나는 당신의 목표가 무엇인지 모르겠습니다. 'QGraphicsView'를 중앙 위젯으로 놓고 클릭하면 뷰는 부모 ('QMainWindow')가 아닌 마우스 이벤트를 얻을 것입니다. 그건 정상입니다. – Avaris
하지만 그 반대입니다. View는 위에서 쓴 것처럼 mousePressEvent 만 허용하고 다른 것은 무시합니다 (mouseMoveEvent, mouseReleaseEvent). – Alex
아니요.'QMainWindow'에 대해'mouse * Event' 메소드를 정의하고 있습니다. 그것들로부터'print'를 보게되면, 그 이벤트는 뷰가 아닌'QMainWindow'에서 _ 생합니다. 뷰와 함께'pressed '된 것을 보는 이유는'QGraphicsView'에서의 이벤트의 기본 구현에 달려 있습니다. view와 함께 아무것도 할 수 없다면 view는 무시하고 부모에게 전달한다. – Avaris