2015-01-22 2 views
3

잠시 후 마우스 좌표를 QGraphicsView 이상으로 추적하려고합니다. 다음과 같이 내가 QGraphicsView로 전환 할 때QGraphicsView는 마우스 이동 이벤트를 어떻게 받습니까?

This answer가 예상대로 작동 QLabel 객체에 대해 잘 작동하지만,하지 : 특히

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.graphicsView = QtGui.QGraphicsView(self) 

     self.graphicsView.setMouseTracking(True) 
     self.graphicsView.installEventFilter(self) 

     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.graphicsView) 


    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.MouseMove and 
      source is self.graphicsView): 
      pos = event.pos() 
      print('mouse move: (%d, %d)' % (pos.x(), pos.y())) 
     return QtGui.QWidget.eventFilter(self, source, event) 

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

,이 이벤트가 잡힌 것으로 보인다 경우에만 내 커서가 건너 이동 QGraphicsView의 경계 (검은 색 선).

enter image description here

는 사람이 말해 왜 더 나은 솔루션이 있을까요? 특정 위젯

답변

3

, 당신은 대신 뷰포트를 사용해야합니다

self.graphicsView.viewport().installEventFilter(self) 
    ... 

def eventFilter(self, source, event): 
    if (event.type() == QtCore.QEvent.MouseMove and 
     source is self.graphicsView.viewport()): 
    ... 
+0

. 도움을 주셔서 감사합니다 : D – veslam

+0

아마 모든것이'QAbstractScrollArea'입니다. 'viewportEvent()'를 오버라이드하는 것은 어떨까요? 또 다른 가능성이있을 것입니다. (나는 보통 이벤트 필터를 사용하지 않았다. 왜냐하면 보통 나는 어쨌든 올바른 이벤트를 무시할 수 있기 때문이다. 그러나 무엇이 더 좋은지 궁금하다.) – Trilarion

2

대안은 직접 QGraphicsViewmouseMoveEvent(event)을 무시하는 것입니다.

예 : 작동

from PySide import QtGui 

class MyGraphicsView(QtGui.QGraphicsView): 

    def __init__(self, parent): 
     QtGui.QGraphicsView.__init__(self, parent) 
     self.setMouseTracking(True) 

    def mouseMoveEvent(self, event): 
     print('mouseMoveEvent: pos {}'.format(event.pos())) 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.graphicsView = MyGraphicsView(self) 

     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.graphicsView) 

app = QtGui.QApplication([]) 
window = Window() 
window.show() 
window.resize(200, 100) 
app.exec_() 
+0

이 대안을 주셔서 감사합니다 :) – veslam