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

joh*_*nix 28 python qt4 pyqt

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

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
Run Code Online (Sandbox Code Playgroud)

我知道有些事件返回一个值,但是trigger()没有.那么我该如何实现呢?我必须自己制作信号吗?

Eli*_*sky 44

用一个 lambda

这是PyQt书中的一个例子:

self.connect(button3, SIGNAL("clicked()"),
    lambda who="Three": self.anyButton(who))
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你也可以使用functools.partial,但我觉得这个lambda方法更简单,更清晰.


Dom*_*rrs 11

如前所述,您可以使用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
Run Code Online (Sandbox Code Playgroud)

来源:snip2code - 使用Lambda函数在PyQt4中传递额外参数


小智 5

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

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
Run Code Online (Sandbox Code Playgroud)