使用PyQt4在QWidget上的eventFilter

4
我有一个包含DrawingPointsWidget的QMainWindow窗口,这个小部件会随机绘制红点。我使用self.installEventFilter(self)安装MouseHovering事件过滤器,并实现eventFilter()方法,在QMainWindow的状态栏中显示鼠标坐标。它有效。但是我想获取这个红点小部件上的鼠标坐标,而不是在QMainWindow上显示。所以,当鼠标位于点部件的左上角时,我希望状态栏显示[0, 0],而不是QMainWindow的左上角。怎么办?我尝试了self.installEventFilter(points),但没有任何反应。
下面是一段可工作的代码。
编辑1
看起来如果我编写points.installEventFilter(self),QtCore.Event.MouseButtonPressed事件被检测到,只有HoverMove没有。所以我的DrawingPointsWidget小部件上的HoverMove事件没有被检测到。令人惊讶的是,QPushButton(QAbstractButton也是QWidget)上的HoverMove事件被检测到!我需要编写button.installEventFilter(self)。
import sys
import random
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *

class MainWindow(QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.__setUI()

    def __setUI(self, appTitle="[default title]"):
        self.statusBar()

        mainWidget = QWidget()
        vbox = QVBoxLayout()

        button = QPushButton("Hello")
        vbox.addWidget( button )

        points = DrawingPointsWidget()

        vbox.addWidget(points)

        mainWidget.setLayout(vbox)
        self.setCentralWidget(mainWidget)
        self.installEventFilter(self)

    def eventFilter(self, object, event):

        if event.type() == QtCore.QEvent.HoverMove:
            mousePosition = event.pos()
            cursor = QtGui.QCursor()

            self.statusBar().showMessage(
                "Mouse: [" + mousePosition.x().__str__() + ", " + mousePosition.y().__str__() + "]"
                + "\tCursor: [" + cursor.pos().x().__str__() + ", " + cursor.pos().y().__str__() + "]"

            )

            return True

        elif event.type() == QtCore.QEvent.MouseButtonPress:
            print "Mouse pressed"
            return True

        return False

class DrawingPointsWidget(QWidget):
    ""
    def __init__(self):
        super(QWidget, self).__init__()
        self.__setUI()

    def __setUI(self):

        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('Points')
        self.show()

    def paintEvent(self, e):
        "Re-implemented method"

        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawPoints(qp)
        qp.end()

    def drawPoints(self, qp):

        qp.setPen(QtCore.Qt.red)

        "Need to get the size in case the window is resized -> generates a new paint event"
        size = self.size()

        for i in range(1000):
            x = random.randint(1, size.width()-1 )
            y = random.randint(1, size.height()-1 )
            qp.drawPoint(x, y)


def main():
    app = QApplication(sys.argv)
    #window = WidgetsWindow2()
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
1个回答

9

首先,需要由您想要监视的对象设置事件过滤器:

points.installEventFilter(self)

其次,您需要监听的事件是 MouseMove 而不是 HoverMove:
if event.type() == QtCore.QEvent.MouseMove:

最后,您需要在目标小部件上启用鼠标跟踪:
class DrawingPointsWidget(QWidget):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setMouseTracking(True)

太好了!谢谢 :) - kaligne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接