连接到另一个小部件的事件

Duš*_*vić 4 python events pyqt python-3.x

这很可能是一个重复的问题,但我不得不问它,因为其他答案对我来说没有帮助,因为我是 pyqt 的新手(几天前从 tkinter 转换而来)。

我想知道是否可以连接到这样的小部件事件:

 self.lineEdit = QtGui.QLineEdit(self.frame)

 self.lineEdit.keyReleaseEvent(lambda: someFunction(QtCore.Qt.Key_A ))

 self.lineEdit.setObjectName(_fromUtf8("lineEdit"))

 self.horizontalLayout.addWidget(self.lineEdit)
Run Code Online (Sandbox Code Playgroud)

进而...

def someFunction(event):
    print(event)
    ...
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从另一个小部件绑定到特定事件,并将该事件与类似函数的btn.clicked.connect(function_goes_here).

在 tkinter 它是这样的:

self.Entry.bind("<KeyRelease-a>", lambda event: someFunction(event))
Run Code Online (Sandbox Code Playgroud)

ekh*_*oro 5

有许多不同的方法可以实现这一点。侦听给定小部件的所有事件的通用方法是在其上安装事件过滤器。所有受保护的函数都有相应的事件类型,可以通过这种方式访问​​:

class MainmWindow(QMainWindow):
    def __init__(self):
        ...
        self.lineEdit = QLineEdit(self.frame)
        self.lineEdit.installEventFilter(self)

    def eventFilter(self, source, event):
        if source is self.lineEdit:
            if event.type() == QEvent.KeyRelease:
                print('key release:', event.key())
                # the following line will eat the key event
                # return True
        return super(MainmWindow, self).eventFilter(source, event)
Run Code Online (Sandbox Code Playgroud)

或者,您可以对小部件进行子类化,重新实现相关的事件处理程序,并发出自定义信号:

class LineEdit(QLineEdit):
    keyReleased = pyqtSignal(int)

    def keyReleaseEvent(self, event):
        self.keyReleased.emit(event.key())
        super(LineEdit, self).keyReleaseEvent(event)

class MainmWindow(QMainWindow):
    def __init__(self):
        ...
        self.lineEdit = LineEdit(self.frame)
        self.lineEdit.keyReleased.connect(self.handleKeyRelease)

    def handleKeyRelease(self, key):
        print('key release:' key)
Run Code Online (Sandbox Code Playgroud)

对此的一个更骇人听闻的变体是直接覆盖该方法:

class MainmWindow(QMainWindow):
    def __init__(self):
        ...
        self.lineEdit = QLineEdit(self.frame)
        self.lineEdit.keyReleaseEvent = self.handleKeyRelease

    def handleKeyRelease(self, event):
        print('key release:', event.key())
        QLineEdit.keyReleaseEvent(self.lineEdit, event)
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不想调用默认事件处理,则可以省略对基类方法的调用。