如何解决有没有办法直接在 PySide2 中将自定义 Signal(int) 与 Push-Button 连接起来?
我想使用参数 (Signal(int)) 将 PushButton 生成的触发器连接到我的自定义信号。
可以将没有参数的信号连接到 Button。目前,我正在创建一个额外的插槽来发出从 Signal() 和 Button 触发的 Signal(int)。有什么简单的方法吗?
class GUI(QObject):
sig_x = Signal()
sig_y = Signal(int)
def __init__(self,parent = None):
super(GUI,self).__init__(parent)
self.value = 10
self.button = QPushButton("Click me")
self.button.clicked.connect(self.sig_x)
#self.button.clicked.connect(self.sig_y(self.value)) want to do something like this
self.sig_x.connect(self.pass_args)
self.sig_y.connect(self.final_function)
#connection slot for sig_x
def pass_args(self):
self.sig_y.emit(self.value)
#demo connection slot for sig_y
def final_function(self,passed_value):
print("passed value is " + str(passed_value))
解决方法
这行不通的原因:
self.button.clicked.connect(self.sig_y(self.value))
是因为 connect()
需要传递一个函数(或者,更准确地说是任何可以调用的东西)。但是这样写,你不是将信号本身传递给它,而是调用信号并传递结果。
一种解决方案是 lambda function。 lambda 是一种定义内联函数的方法;这样你就可以在那里定义一个新函数,在你将它传递给 connect
的同一行中。
self.button.clicked.connect(lambda x: self.sig_y(self.value))
您可以在 this quesiton 中看到更多有关其工作原理的上下文,即使问题本身是关于获得稍微复杂的版本的工作。
这一切都假设您需要这个信号结构,原因在您的示例中并不明显。如果没有,您只需将按钮点击信号直接连接到您的 final_function
,无需自定义信号。
class GUI(QObject):
def __init__(self,parent=None):
super().__init__(parent)
self.value = 10
self.button = QPushButton("Click me")
self.button.clicked.connect(self.final_function)
def final_function(self,state):
print(f"My value is {self.value}.")
即便如此,如果你需要一个信号来通知其他事情,你也可以将它添加到方法中:
def final_function(self,state):
print(f"My value is {self.value}.")
self.sig_y.emit(self.value)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。