PySide2 自定义信号错误:“AttributeError:‘function’对象没有属性‘connect’”

Posted

技术标签:

【中文标题】PySide2 自定义信号错误:“AttributeError:‘function’对象没有属性‘connect’”【英文标题】:PySide2 Custom Signal Error: "AttributeError: 'function' object has no attribute 'connect'" 【发布时间】:2021-03-26 01:31:16 【问题描述】:

这是我使用 PySide 的第三个项目,在尝试使用自定义信号和插槽时遇到了一个不寻常的错误。下面是我正在处理的一个变体,它给了我 AttributeError。我已经为其他项目使用了类似的语法,没有任何问题,因此感谢您的帮助。我确实理解我试图将函数连接到插槽的错误,但是如果我使用 @Signal 装饰器,我会收到一个单独的错误,基本上说我不能使用它。

from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
import sys


class TestSignal(QObject):
    signal = Signal(float)

    def __init__(self):
        QObject.__init__(self)

    def changed(self, test_value: float):
        self.signal.emit(test_value)


class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.signal = TestSignal()
        self.signal.changed.connect(self.test_slot) # this is where the error occurs
    
        self.central_widget = QWidget()

        self.go_button = QPushButton("Emit")
        self.go_button.clicked.connect(self.emit_signal)

        self.change_label = QLabel("Push Button")

        self.test_layout = QVBoxLayout()
        self.test_layout.addWidget(self.change_label)
        self.test_layout.addWidget(self.go_button)
        self.setCentralWidget(self.central_widget)

        self.central_widget.setLayout(self.test_layout)

        self.show()

    @Slot(float)
    def test_slot(self, test_value):
        self.change_label.setText("Emitted Signal successcully")

    def emit_signal(self):
        self.signal.changed()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()

    app.exec_()
    sys.exit(0)

【问题讨论】:

【参考方案1】:

信号称为“信号”,“改变”只是发出信号的一种方法。建议:使用更具描述性的名称以避免此类混淆

class TestSignal(QObject):
    signal = Signal(float)

    def changed(self, test_value: float):
        self.signal.emit(test_value)


class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.signal = TestSignal()
        self.signal.signal.connect(self.test_slot)
    
        self.central_widget = QWidget()

        self.go_button = QPushButton("Emit")
        self.go_button.clicked.connect(self.emit_signal)

        self.change_label = QLabel("Push Button")

        self.test_layout = QVBoxLayout()
        self.test_layout.addWidget(self.change_label)
        self.test_layout.addWidget(self.go_button)
        self.setCentralWidget(self.central_widget)

        self.central_widget.setLayout(self.test_layout)

        self.show()

    @Slot(float)
    def test_slot(self, test_value):
        self.change_label.setText("Emitted Signal successcully ".format(test_value))

    def emit_signal(self):
        self.signal.changed(5.0)

【讨论】:

啊,我明白了,谢谢你的帮助!我通常为它们使用更具描述性的名称,我只是快速将其写为测试用例。为了澄清这个例子,你说 QPushButton 会有一个名为“clicked”的类信号,它是在类中其他地方定义的某个函数下发出的?

以上是关于PySide2 自定义信号错误:“AttributeError:‘function’对象没有属性‘connect’”的主要内容,如果未能解决你的问题,请参考以下文章

Pyside2 信号槽 2d 数组签名定义,等效于列表列表

如何断开 PySide2 中的按钮单击信号?

带有命名参数的 PySide2 (5.14.2) 信号

使用 PySide2 将 python 信号连接到 QML ui 插槽

pyside2pycharm关联方法

PySide2 使用 QProgressBar 作为信号参数