我有一个任务栏菜单,点击后连接到获取触发事件的插槽。现在问题是我想知道单击了哪个菜单项,但我不知道如何将该信息发送到连接的功能。这是用于将动作连接到函数:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
我知道有些事件返回一个值,但是trigger()没有。那么我该如何实现呢?我是否必须发出自己的信号?
答案 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