2009-06-02 97 views
27

我有一個任務欄菜單,當單擊它時,它將連接到一個獲取觸發事件的插槽。現在問題是我想知道哪個菜單項被點擊了,但我不知道如何將這些信息發送到連接的功能。這裏是用來操作連接功能:當連接到信號時,PyQt向插槽發送參數

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc) 

我知道一些事件返回一個值,但觸發()不會。那麼我該如何做到這一點?我必須自己發出信號嗎?

回答

40

使用lambda

下面是來自PyQt book一個例子:

self.connect(button3, SIGNAL("clicked()"), 
    lambda who="Three": self.anyButton(who)) 

順便問一下,你也可以使用functools.partial,但我覺得lambda方法更加簡單和清晰。

+0

嘿,非常感謝!完全救了我很多挫敗感。我應該可以拿到那本書... – johannix 2009-06-02 17:03:52

+1

你真的應該 - 這本書很好。 – 2009-06-02 18:56:14

+0

真棒的答案,這正是我正在尋找 – Bedros 2014-07-01 19:22:52

0

通常,您應該將每個菜單項連接到不同的插槽,並且每個插槽僅處理其自己的菜單項的功能。例如,如果您有類似「保存」,「關閉」,「打開」的菜單項,則應爲每個菜單項分別設置一個插槽,而不是嘗試在其中放置一個帶有case語句的單個插槽。

如果你不想這樣做,你可以使用QObject::sender()函數來獲取一個指向發送者的指針(即:發出信號的對象)。不過,我想多瞭解一些你想要完成的事情。

7

正如已經提到的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

3

使用functools.partial

否則你會發現當腳本運行時,如果你使用的λ不能動態傳遞參數。

0

我還想補充一點,如果您只需要找出小部件發送的信號,就可以使用sender方法。例如:

def menuClickedFunc(self): 
    # The sender object: 
    sender = self.sender() 
    # The sender object's name: 
    senderName = sender.objectName() 
    print senderName