如何在PyQT中使用预定义的SIGNAL将参数传递给函数

时间:2011-03-19 19:15:33

标签: python pyqt4 signals-slots

假设你在一个类中有3个QRadioButtons实例

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,以便它知道用户点击了QRadioButtons?所以我可以做像

这样的事情
def myFunction(choice):
   if choice == Option1:
       do something
   if choice == Option2:
       do something

现在我有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)

这种方法运行得很好,但你可以看到代码增长得有多快,因为我添加的每个小部件都必须编写至少一个新功能或修改现有功能,这将成为维护噩梦(更不用说它看起来很丑陋,它会阻止代码重用)。

快速访问谷歌让我这样:

    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)

(我再次没有包含整个脚本,但您可以查看here) 他所做的是创建一个定义自定义发射器的方法,该发射器在发出时发送参数,然后使用

手动激活它
self.do_something()

很自然地,connect函数选择了这个emition并将参数传递给函数update_label,部分实现了我想做的事情。但是他是手动完成的,有没有办法自动“拦截”标准信号(例如QRad()信号QRadioButtons发出的)并为它添加参数,所以它们被传递给一个函数来处理它们?

提前致谢

1 个答案:

答案 0 :(得分:2)

我认为这个问题的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