2009-06-02 61 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