题
我有点击时连接到获取触发事件时隙中的任务栏菜单。现在的问题是,我想知道单击的菜单项,但我不知道如何发送信息给连接到的功能。这里是用来连接动作到功能:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
我知道一些事件返回一个值,但触发()不会。那么,如何做到这一点?我必须使自己的信号?
解决方案
使用一个lambda
下面是来自 PyQt的书的示例:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
顺便说一句,你也可以使用functools.partial
,但我觉得lambda
方法更加简单和清晰。
其他提示
前面已经提到这里 你可以使用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
使用functools.partial
,否则你会发现你不能传递参数时动态脚本运行时,如果你使用的λ。
在一般情况下,你应该有连接到不同的时隙中的每个菜单项,并有只为它自己的菜单项,每个插槽处理功能。举例来说,如果你有一个像“拯救”,“关闭”,“打开”菜单项,你应该为每个独立的插槽,而不是试图有一个case语句单槽它。
如果你不想这样做的,你可以使用的 QObject的::发送者()函数来获得的指针发送者(即:所发射的信号中的对象)。我想听到更多一些关于你想要什么来完成,虽然。
我还想补充一点,你可以使用sender
方法,如果你只需要找出小部件发出的信号。例如:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName
不隶属于 StackOverflow