在不丢失默认信号参数的情况下将额外参数传递给 PyQt 插槽

Posted

技术标签:

【中文标题】在不丢失默认信号参数的情况下将额外参数传递给 PyQt 插槽【英文标题】:Pass extra arguments to PyQt slot without losing default signal arguments 【发布时间】:2016-06-29 04:23:08 【问题描述】:

PyQt 按钮事件可以以正常方式连接到函数,以便函数接收默认信号参数(在本例中为按钮检查状态):

def connections(self):
    my_button.clicked.connect(self.on_button)

def on_button(self, checked):
    print checked   # prints "True"

或者,可以使用lambda 覆盖默认信号参数:

def connections(self):
    my_button.clicked.connect(lambda: self.on_button('hi'))

def on_button(self, message):
    print message   # prints "hi"

有没有一种很好的方法来保留两个信号参数,以便它可以被下面的函数直接接收?

def on_button(self, checked, message):
    print checked, message   # prints "True, hi"

【问题讨论】:

您可以对按钮进行子类化并创建一个新信号,该信号将发出按钮的状态和消息。 Eli Bendersky 于 2011 年发布 an article about this。 【参考方案1】:

您的lambda 可以接受参数:

def connections(self):
    my_button.clicked.connect(lambda checked: self.on_button(checked, 'hi'))

def on_button(self, checked, message):
    print checked, message   # prints "True, hi"

或者你可以使用functools.partial:

# imports the functools module
import functools 

def connections(self):
    my_button.clicked.connect(functools.partial(self.on_button, 'hi'))

def on_button(self, message, checked):
    print checked, message   # prints "True, hi"

【讨论】:

这个答案永远不会过时。它一直在拯救我。谢谢!

以上是关于在不丢失默认信号参数的情况下将额外参数传递给 PyQt 插槽的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不重复变量名的情况下将命名参数传递给格式化宏?

如何在不指定每一列的情况下将整行作为参数传递给 Spark(Java)中的 UDF?

如何将命名参数传递给 Rake 任务?

有没有办法在 CodeIgniter *不*使用 ActiveRecord 的情况下将参数传递给查询?

如何在不丢失信号的情况下将信号从多个子进程发送到主进程?

将构造函数传递给函数