Почему 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
→ Ссылка
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())