有许多不同的方式来实现这一目标。一个通用的方法来听所有事件特定窗口小部件,是install an event-filter它:
class MainmWindow(QtGui.QMainWindow):
def __init__(self):
...
self.lineEdit = QtGui.QLineEdit(self.frame)
self.lineEdit.installEventFilter(self)
def eventFilter(self, source, event):
if source is self.lineEdit:
if event.type() == QtCore.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(QtGui.QLineEdit):
keyReleased = QtCore.pyqtSignal(int)
def keyReleaseEvent(self, event):
self.keyReleased.emit(event.key())
super(LineEdit, self).keyReleaseEvent(event)
class MainmWindow(QtGui.QMainWindow):
def __init__(self):
...
self.lineEdit = LineEdit(self.frame)
self.lineEdit.keyReleased.connect(self.handleKeyRelease)
def handleKeyRelease(self, key):
print('key release:' key)
在此更hackish的变化是直接改写方法:
class MainmWindow(QtGui.QMainWindow):
def __init__(self):
...
self.lineEdit = QtGui.QLineEdit(self.frame)
self.lineEdit.keyReleaseEvent = self.handleKeyRelease
def handleKeyRelease(self, event):
print('key release:', event.key())
QtGui.QLineEdit.keyReleaseEvent(self.lineEdit, event)
注意如果您不想调用默认事件处理,则可以省略对基类方法的调用。
我喜欢这个hackish的方式:D,但我还有一个问题。是否可以绑定两个键,如“Ctrl + a”或其他组合,因为此键释放事件返回两个键代码,一个用于“Ctrl”,另一个用于“a”?或者有另一个意图使用的事件,而不是'keyRelase',为此目的 –
@DušanAtanacković。所有你需要的是一个简单的if语句来检查你喜欢的任何键组合:'if event.modifiers()== QtCore.Qt.ControlModifier and event.key()== QtCore.Qt.Key_A:'。 – ekhumoro
我知道这个问题与以前没有关系,但我想知道你使用的是什么操作系统,因为这个问题与我正在开发的程序有关(为了好玩)。我想要制作的程序就像快速安装程序的Linux,所以我想知道如果你是有趣的项目,你可以在这里检查它,如果你想https://github.com/Dusan92Atanackovic/luqi.git 问候 –