有許多不同的方式來實現這一目標。一個通用的方法來聽所有事件特定窗口小部件,是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 問候 –