我有一個任務欄菜單,當單擊它時,它將連接到一個獲取觸發事件的插槽。現在問題是我想知道哪個菜單項被點擊了,但我不知道如何將這些信息發送到連接的功能。這裏是用來操作連接功能:當連接到信號時,PyQt向插槽發送參數
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
我知道一些事件返回一個值,但觸發()不會。那麼我該如何做到這一點?我必須自己發出信號嗎?
我有一個任務欄菜單,當單擊它時,它將連接到一個獲取觸發事件的插槽。現在問題是我想知道哪個菜單項被點擊了,但我不知道如何將這些信息發送到連接的功能。這裏是用來操作連接功能:當連接到信號時,PyQt向插槽發送參數
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
我知道一些事件返回一個值,但觸發()不會。那麼我該如何做到這一點?我必須自己發出信號嗎?
使用lambda
下面是來自PyQt book一個例子:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
順便問一下,你也可以使用functools.partial
,但我覺得lambda
方法更加簡單和清晰。
通常,您應該將每個菜單項連接到不同的插槽,並且每個插槽僅處理其自己的菜單項的功能。例如,如果您有類似「保存」,「關閉」,「打開」的菜單項,則應爲每個菜單項分別設置一個插槽,而不是嘗試在其中放置一個帶有case語句的單個插槽。
如果你不想這樣做,你可以使用QObject::sender()函數來獲取一個指向發送者的指針(即:發出信號的對象)。不過,我想多瞭解一些你想要完成的事情。
正如已經提到的here,您可以使用lambda函數將額外的參數傳遞給您要執行的方法。
在此示例中,您可以將字符串obj傳遞給按下按鈕時調用的函數AddControl()。
# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
print name
來源:snip2code - Using Lambda Function To Pass Extra Argument in PyQt4
使用functools.partial
否則你會發現當腳本運行時,如果你使用的λ不能動態傳遞參數。
我還想補充一點,如果您只需要找出小部件發送的信號,就可以使用sender
方法。例如:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName
嘿,非常感謝!完全救了我很多挫敗感。我應該可以拿到那本書... – johannix 2009-06-02 17:03:52
你真的應該 - 這本書很好。 – 2009-06-02 18:56:14
真棒的答案,這正是我正在尋找 – Bedros 2014-07-01 19:22:52