使用 PyQt4 在 QWidget 上进行事件过滤器

问题描述 投票:0回答:1

我有一个 QMainWindow,其中包含一个

DrawingPointsWidget
。该小部件随机绘制红点。我通过使用
self.installEventFilter(self)
为 MouseHovering 事件安装事件过滤器并实现
eventFilter()
方法,在 QMainWindow 的状态栏中显示鼠标坐标。有用。但是我想获取这个红点小部件上的鼠标坐标,而不是 QMainWindow 上的坐标。所以我希望当鼠标位于点部件的左上角而不是 QMainWindow 的左上角时,状态栏显示 [0, 0]。我怎么做?我尝试了
self.installEventFilter(points)
但什么也没发生。

您将在下面找到一段有效的代码。


编辑1

似乎如果我写

points.installEventFilter(self)
,就会检测到
QtCore.Event.MouseButtonPressed
事件,只有
HoverMove
没有检测到。因此,在我的
HoverMove
(即
DrawingPointsWidget
)上未检测到
QWidget
事件。 令人惊讶的是,在
HoverMove
上检测到
QPushButton
事件,这是一个
QAbstractButton
,这也是一个
QWidget
!我要写
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()
python events mouseevent pyqt4 qwidget
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)
    
© www.soinside.com 2019 - 2024. All rights reserved.