我想用一个参数(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)