简体   繁体   English

捕捉鼠标事件

[英]Catch the mouse event

Don't know exactly how to give the parameters of QMouseEvent class. Should I create new class to implement a QMouseEvent into my QTextEdit?不知道如何给 QMouseEvent class 的参数。我应该创建新的 class 来在我的 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()

Since many times it is asked how to detect the events that affect a widget then in this answer I will detail the solution and it will be used as a canonical answer for future questions.由于多次被问及如何检测影响小部件的事件,因此在这个答案中我将详细说明解决方案,它将用作未来问题的规范答案。

To detect an event from a widget there are several solutions:要检测来自小部件的事件,有几种解决方案:

- Override a method - 覆盖一个方法

If the widget has a method that handles that event then an option is to override that method and associate it with a signal so that other objects can be notified.如果小部件具有处理该事件的方法,那么一个选项是覆盖该方法并将其与信号相关联,以便可以通知其他对象。

In the particular case of the mouse release event, this is handled by the mouseReleaseEvent method.在鼠标释放事件的特定情况下,这是由 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_())

- Use an event filter - 使用事件过滤器

Qt allows you to monitor the events using an event filter, so you can take advantage of this feature to emit a signal in a similar way to the previous solution. Qt 允许您使用事件过滤器监视事件,因此您可以利用此功能以与之前的解决方案类似的方式发出信号。

In the case of classes that inherit from QAbstractScrollArea, the mouse methods are transmitted to the viewport, so that object must be monitored.对于继承自QAbstractScrollArea的类,鼠标方法被传递到视口,因此必须监视object。

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_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM