如何在PyQT中使用预定义信号向函数传递参数
假设你在一个类里面有三个 QRadioButton 的实例。
self.Option1 = QRadioButton()
self.Option2 = QRadioButton()
self.Option2 = QRadioButton()
(为了简洁,我没有写完整的脚本)你想让这些按钮在用户点击时执行一个特定的函数,所以你这样做:
self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)
我该如何将参数传递给 myFunction,以便它知道用户点击了哪个 QRadioButton?这样我就可以做一些事情,比如:
def myFunction(choice):
if choice == Option1:
do something
if choice == Option2:
do something
现在我有三个函数,每个按钮都有一个连接,像这样:
self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction1)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)
这种方法运行得很好,但你可以看到,随着我添加每个新的控件,代码会迅速膨胀,因为我必须为每个新控件写至少一个新函数,或者修改现有的函数,这样会让维护变得很麻烦(更不用说代码看起来很丑,而且不利于代码重用)。
我在谷歌上快速查找了一下,找到了这个:
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)
(同样,我没有包括完整的脚本,但你可以在这里查看)他做的是创建一个方法,定义一个自定义的发射器,当发射时发送参数,然后手动激活它,使用:
self.do_something()
所以,自然地,连接函数会捕捉到这个发射,并将参数传递给 update_label 函数,部分实现了我想做的事情。但他是手动操作的,有没有办法自动“拦截”标准信号(例如 QRadioButton 发出的 clicked() 信号),并给它添加参数,这样就可以传递给一个函数来处理它们?
提前谢谢你!
1 个回答
7
我觉得这个问题在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))
想了解更多信息,可以查看这个链接:http://docs.python.org/library/functools.html#functools.partial