35

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

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

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

4

5 回答 5

53

用一个lambda

这是PyQt 书中的一个例子:

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

顺便说一句,您也可以使用functools.partial,但我发现该lambda方法更简单明了。

于 2009-06-02T16:52:11.950 回答
16

正如这里已经提到的,您可以使用 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 - 在 PyQt4 中使用 Lambda 函数传递额外参数

于 2013-11-03T10:56:42.807 回答
4

使用 functools.partial

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

于 2015-11-30T15:13:04.773 回答
3

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

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
于 2017-04-17T19:43:35.943 回答
0

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

如果您不想那样做,您可以使用QObject::sender()函数来获取指向发送者的指针(即:发出信号的对象)。不过,我想更多地了解您要完成的工作。

于 2009-06-02T16:52:40.530 回答