首页 > 解决方案 > 如何为 QTextEdit 小部件定义 mousePressEvent 函数而不对其进行子类化?

问题描述

class widget(QWidget):
    ...
        self.edit=QTextEdit()

    def mousePressEvent(self, event):
        if event.button()==Qt.LeftButton:
            print('test')
        self.edit.mousePressEvent(event)

我已经尝试过了,但它不起作用。它适用于父小部件。无论如何我可以在不继承 QTextEdit 的情况下做到这一点吗?

标签: pythonmouseeventpyqt5qtextedit

解决方案


在这种情况下,您必须使用eventFilter除了继承自的类之外的类,QAbstractScrollArea因为QTextEdit您必须使用viewport()

from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.edit = QtWidgets.QTextEdit()
        btn = QtWidgets.QPushButton()
        le = QtWidgets.QLineEdit()

        lay = QtWidgets.QVBoxLayout(self)
        for w in (self.edit, btn, le):
            lay.addWidget(w)

        self.edit.viewport().installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is self.edit.viewport() and event.type() == QtCore.QEvent.MouseButtonPress:
            if event.button() == QtCore.Qt.LeftButton:
                print('test')
        return super(Widget, self).eventFilter(obj, event)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

推荐阅读