捕捉鼠标事件

Posted

技术标签:

【中文标题】捕捉鼠标事件【英文标题】:Catch the mouse event 【发布时间】:2020-09-20 05:15:29 【问题描述】:

不知道QMouseEvent 类的参数如何给出。我应该创建新类以在我的 QTextEdit 中实现 QMouseEvent 吗?

class Test(QMainWindow):
    def __init__(self):
        super().__init__()

        self.txt = QTextEdit(self)
        self.txt.setMouseTracking(True)
        
        self.txt.mouseReleaseEvent(QMouseEvent())

class Test2(QTextEdit):
    def __init__(self):
        super().__init__()

    def mouseReleaseEvent(self, e):
        print("text edit is clicked")

ui = Test()
ui.show()

【问题讨论】:

您的问题令人困惑,请您解释清楚。 对不起,我编辑了它。你能不能再帮我理解一下。谢谢。 我更了解您的目标,但如果您利用帖子(不仅仅是标题)清楚地解释您的目标,那就太好了。我不明白 Qt 文档与您的问题有什么关系,恕我直言,这无关紧要。 【参考方案1】:

由于多次询问如何检测影响小部件的事件,因此在此答案中我将详细介绍解决方案,并将其用作未来问题的规范答案。

要从小部件中检测事件,有几种解决方案:

- 覆盖一个方法

如果小部件具有处理该事件的方法,则可以选择覆盖该方法并将其与信号相关联,以便可以通知其他对象。

在鼠标释放事件的特殊情况下,这是由 mouseReleaseEvent 方法处理的。

from PyQt5 import QtCore, QtWidgets


class TextEdit(QtWidgets.QTextEdit):
    released = QtCore.pyqtSignal()

    def mouseReleaseEvent(self, event):
        super().mouseReleaseEvent(event)
        self.released.emit()


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.textedit = TextEdit()
        self.textedit.released.connect(self.handle_released)
        self.setCentralWidget(self.textedit)

    @QtCore.pyqtSlot()
    def handle_released(self):
        print("released")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

- 使用事件过滤器

Qt 允许您使用事件过滤器来监控事件,因此您可以利用此功能以与以前的解决方案类似的方式发出信号。

在继承自 QAbstractScrollArea 的类的情况下,鼠标方法被传输到视口,因此必须监视对象。

from PyQt5 import QtCore, QtWidgets


class ReleaseFilter(QtCore.QObject):
    released = QtCore.pyqtSignal()

    def __init__(self, widget):
        super().__init__(widget)
        self._widget = widget
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, obj, event):
        if obj is self.widget and event.type() == QtCore.QEvent.MouseButtonRelease:
            self.released.emit()
        return super().eventFilter(obj, event)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.textedit = QtWidgets.QTextEdit()
        rf = ReleaseFilter(self.textedit.viewport())
        rf.released.connect(self.handle_released)
        self.setCentralWidget(self.textedit)

    @QtCore.pyqtSlot()
    def handle_released(self):
        print("released")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于捕捉鼠标事件的主要内容,如果未能解决你的问题,请参考以下文章

如何捕捉键盘和鼠标事件?

winform中键盘和鼠标事件的捕捉和重写

如何捕捉鼠标点击事件到重叠的ItemsControl

鼠标事件不工作两次

JS—事件类型(焦点事件、鼠标事件(部分))

NCurses 中的鼠标移动事件