如何在PyQT中使用预定义信号向函数传递参数

0 投票
1 回答
4934 浏览
提问于 2025-04-16 14:02

假设你在一个类里面有三个 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

撰写回答