有没有任何方法可以直接在PySide2中连接自定义信号(int)和按钮



我想用一个参数(signal(int((将PushButton生成的触发器连接到我的自定义信号。

可以将没有参数的信号连接到按钮。目前,我正在创建一个额外的插槽来发射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函数。lambda是内联定义函数的一种方式;通过这种方式,您可以在传递给connect的同一行中定义一个新函数。

self.button.clicked.connect(lambda x: self.sig_y(self.value))

你可以在这个问题中看到更多关于它是如何工作的上下文,尽管问题本身是关于让一个稍微复杂一点的版本工作。


这都是假设你需要这个信号结构,原因在你的例子中并不明显。如果没有,您可以简单地将单击按钮的信号直接连接到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)

最新更新