Почему Slot() не ловит значения Сигнала?

Есть код:

from PySide6 import QtCore
from PySide6 import QtWidgets


class Sender(QtWidgets.QMainWindow):
    signal = QtCore.Signal(int)
    def __init__(self):
        super().__init__()
    
    def Emmit(self):
        self.signal.emit(666)


class Recivier(QtWidgets.QWidget):
    def __init__(self,):
        super().__init__()

   @QtCore.Slot(int)
    def recive(self, value):
        print(value)


app = QtWidgets.QApplication([])
sen = Sender()
rec = Recivier()
sen.signal.connect(Recivier.recive)
sen.Emmit()
app.exec()

при попытке вывода переданного значения происходит ошибка:

TypeError: Recivier.recive() missing 1 required positional argument: 'value'

Так ли оно работает, и если не так, то как оно на самом деле работает и где об этом говориться?


Ответы (1 шт):

Автор решения: S. Nick

Signals & Slots

Signals and Slots

Support for Signals and Slots


main.py:

import sys
'''
from PySide6 import QtCore, QtWidgets, QtGui
'''
from PyQt5 import QtCore, QtWidgets, QtGui


class Sender(QtWidgets.QMainWindow):
#    signal = QtCore.Signal(int)                  # PySide6       # 1
    signal = QtCore.pyqtSignal(int)               # PyQt5

    def __init__(self):
        super().__init__()
    
    def emmit(self):
        self.signal.emit(777)                                     # 3


class Recivier(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Recivier, self).__init__(parent)

#   @QtCore.Slot(int)                             # PySide6
    @QtCore.pyqtSlot(int)                         # PyQt5
    def recive(self, value):                                      # 4
        print(f'value = {value}')
        self.window().label.setText(f'{value}')


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.label = QtWidgets.QLabel(
            'Через 3 секунды сработает сигнал', 
            alignment = QtCore.Qt.AlignCenter)
        font = QtGui.QFont("Times New Roman", 24)
        self.label.setFont(font)
        
        self.layout = QtWidgets.QVBoxLayout(self.centralWidget)
        self.layout.addWidget(self.label)
        
        self.recivier = Recivier(self)
        
        self.sender = Sender()
        self.sender.signal.connect(self.recivier.recive)          # 2
        
        QtCore.QTimer.singleShot(3000, self.sender.emmit)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка