有多种不同的方法可以实现这一目标。通用的聆听方式all给定小部件的事件是安装事件过滤器 https://doc.qt.io/qt-5/qobject.html#installEventFilter在上面。全部受保护的函数 http://qt-project.org/doc/qt-5/qwidget.html#protected-functions有相应的事件类型 http://qt-project.org/doc/qt-5/qevent.html#Type-enum可以通过以下方式访问:
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)
或者,您可以对小部件进行子类化,重新实现相关的事件处理程序,并发出自定义信号:
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)
一个更黑客的变体是直接覆盖该方法:
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)
请注意,如果您不想调用默认事件处理,则可以省略对基类方法的调用。