2017-07-28 52 views
1

這是最有可能重複的問題,但我不得不問,因爲其他答案沒有幫助我的情況,因爲我是pyqt(從tkinter前幾天轉換)的新手。將keyRelease事件連接到PyQt4小部件

我想知道是否有可能像>

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) 

,然後用小部件事件連接...

def someFunction(event): 
    print(event) 
    ... 

我的問題是如何綁定特定事件時窗口小部件,並連接該事件與功能...像btn.clicked.connect(function_goes_here)

在tkinter它是這樣的:

self.Entry.bind("<KeyRelease-a>", lambda event: someFunction(event)) 

簡單的工作示例將是巨大的,如果可能的話

回答

1

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

注意如果您不想調用默認事件處理,則可以省略對基類方法的調用。

+0

我喜歡這個hackish的方式:D,但我還有一個問題。是否可以綁定兩個鍵,如「Ctrl + a」或其他組合,因爲此鍵釋放事件返回兩個鍵代碼,一個用於「Ctrl」,另一個用於「a」?或者有另一個意圖使用的事件,而不是'keyRelase',爲此目的 –

+1

@DušanAtanacković。所有你需要的是一個簡單的if語句來檢查你喜歡的任何鍵組合:'if event.modifiers()== QtCore.Qt.ControlModifier and event.key()== QtCore.Qt.Key_A:'。 – ekhumoro

+0

我知道這個問題與以前沒有關係,但我想知道你使用的是什麼操作系統,因爲這個問題與我正在開發的程序有關(爲了好玩)。我想要製作的程序就像快速安裝程序的Linux,所以我想知道如果你是有趣的項目,你可以在這裏檢查它,如果你想https://github.com/Dusan92Atanackovic/luqi.git 問候 –