PyQt在连接信号时将参数发送到插槽

时间:2009-06-02 16:38:01

标签: python qt4 pyqt

我有一个任务栏菜单,点击后连接到获取触发事件的插槽。现在问题是我想知道单击了哪个菜单项,但我不知道如何将该信息发送到连接的功能。这是用于将动作连接到函数:

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

我知道有些事件返回一个值,但是trigger()没有。那么我该如何实现呢?我是否必须发出自己的信号?

5 个答案:

答案 0 :(得分:44)

使用lambda

以下是PyQt book

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

顺便说一下,您也可以使用functools.partial,但我发现lambda方法更简单,更清晰。

答案 1 :(得分:9)

如前所述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

答案 2 :(得分:3)

使用functools.partial

否则,如果使用lambda,则会发现在脚本运行时无法动态传递参数。

答案 3 :(得分:0)

通常,您应该将每个菜单项连接到不同的插槽,并让每个插槽仅处理其自己的菜单项的功能。例如,如果您有“保存”,“关闭”,“打开”等菜单项,则应为每个菜单项创建一个单独的插槽,而不是尝试在其中包含带有case语句的单个插槽。

如果您不想这样做,可以使用QObject::sender()函数获取指向发送方的指针(即:发出信号的对象)。不过,我想更多地了解一下你想要完成的事情。

答案 4 :(得分:0)

我还想补充一点,如果您只需要找出发送信号的小部件,就可以使用sender方法。例如:

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