Gui*_*eba 0 python signals-slots pyqt4
假设类中有 3 个 QRadioButtons 实例
self.Option1 = QRadioButton()
self.Option2 = QRadioButton()
self.Option2 = QRadioButton()
Run Code Online (Sandbox Code Playgroud)
(为了简洁起见,我没有编写整个脚本)并且您想在用户单击它时使用它们来执行特定的函数,所以您可以这样做
self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)
Run Code Online (Sandbox Code Playgroud)
如何将参数传递给 myFunction,以便它知道用户单击了哪个 QRadioButton?所以我可以做类似的事情
def myFunction(choice):
if choice == Option1:
do something
if choice == Option2:
do something
Run Code Online (Sandbox Code Playgroud)
现在我有 3 个函数,每个函数对应每个这样的连接
self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction1)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)
Run Code Online (Sandbox Code Playgroud)
这种方法工作得很好,但是你可以看到代码增长的速度有多快,因为我添加的每个小部件我都必须编写至少一个新函数或修改现有函数,这将是一场维护噩梦(不是为了提到它看起来很丑并且它阻止了代码重用)。
快速访问谷歌让我得到了这个:
self.label = QLabel(" ")
self.connect(self, SIGNAL("didSomething"),
self.update_label)
self.do_something()
def do_something(self):
self.emit(SIGNAL("didSomething"), "important", "information")
def update_label(self, value1, value2):
self.label.setText(value1 + " " + value2)
Run Code Online (Sandbox Code Playgroud)
(我再次没有包含整个脚本,但你可以在这里查看)他所做的是创建一个方法来定义一个自定义发射器,该发射器在发射时发送参数,然后使用手动激活它
self.do_something()
Run Code Online (Sandbox Code Playgroud)
所以很自然地,connect 函数选择这个发射并将参数传递给函数 update_label,部分实现了我想要做的事情。但他是手动完成的,有没有办法自动“拦截”标准信号(例如 QRadioButtons 发出的 clicked() 信号)并向其添加参数,以便将它们传递给函数来使用它们?
提前致谢
我认为这个问题的Qt解决方案是QSignalMapper。但我以前也遇到过同样的问题,我发现使用“部分”功能更简单。像这样使用它:
from functools import partial
self.connect(self.Option1,SIGNAL("clicked()"), partial(self.myFunction, 1))
self.connect(self.Option2,SIGNAL("clicked()"), partial(self.myFunction, 2))
self.connect(self.Option3,SIGNAL("clicked()"), partial(self.myFunction, 3))
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息:http://docs.python.org/library/functools.html#functools.partial