当连接到信号时,PyQt向插槽发送参数
问题描述:
我有一个任务栏菜单,当单击它时,它将连接到一个获取触发事件的插槽。现在问题是我想知道哪个菜单项被点击了,但我不知道如何将这些信息发送到连接的功能。这里是用来操作连接功能:当连接到信号时,PyQt向插槽发送参数
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
我知道一些事件返回一个值,但触发()不会。那么我该如何做到这一点?我必须自己发出信号吗?
答
使用lambda
下面是来自PyQt book一个例子:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
顺便问一下,你也可以使用functools.partial
,但我觉得lambda
方法更加简单和清晰。
答
通常,您应该将每个菜单项连接到不同的插槽,并且每个插槽仅处理其自己的菜单项的功能。例如,如果您有类似“保存”,“关闭”,“打开”的菜单项,则应为每个菜单项分别设置一个插槽,而不是尝试在其中放置一个带有case语句的单个插槽。
如果你不想这样做,你可以使用QObject::sender()函数来获取一个指向发送者的指针(即:发出信号的对象)。不过,我想多了解一些你想要完成的事情。
答
正如已经提到的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
答
使用functools.partial
否则你会发现当脚本运行时,如果你使用的λ不能动态传递参数。
答
我还想补充一点,如果您只需要找出小部件发送的信号,就可以使用sender
方法。例如:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName
嘿,非常感谢!完全救了我很多挫败感。我应该可以拿到那本书... – johannix 2009-06-02 17:03:52
你真的应该 - 这本书很好。 – 2009-06-02 18:56:14
真棒的答案,这正是我正在寻找 – Bedros 2014-07-01 19:22:52