QGraphicsView如何接收鼠标移动事件?

时间:2015-01-22 02:12:34

标签: python qt pyqt mouseevent qgraphicsview

简单地说,我想跟踪QGraphicsView上的鼠标坐标。

This answer适用于QLabel对象,但在切换到QGraphicsView时不能正常工作,如下所示:

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

有谁可以告诉我为什么,还有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

对于某些小部件,您需要使用其视口:

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

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

答案 1 :(得分:2)

另一种方法是直接覆盖mouseMoveEvent(event)的{​​{1}}。

示例:

QGraphicsView