微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法直接在 PySide2 中将自定义 Signal(int) 与 Push-Button 连接起来?

如何解决有没有办法直接在 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 举报,一经查实,本站将立刻删除。