PySide2 Custom Signal Error: "AttributeError: 'function' object has no attribute 'connect'"
PySide2 Custom Signal Error: "AttributeError: 'function' object has no attribute 'connect'"
这是我使用 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)
信号称为“signal”,“changed”只是发出信号的方法。建议:使用更具描述性的名称以避免此类混淆
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.<b>signal</b>.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 <b>{}".format(test_value)</b>)
def emit_signal(self):
self.signal.changed(<b>5.0</b>)
这是我使用 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)
信号称为“signal”,“changed”只是发出信号的方法。建议:使用更具描述性的名称以避免此类混淆
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.<b>signal</b>.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 <b>{}".format(test_value)</b>)
def emit_signal(self):
self.signal.changed(<b>5.0</b>)