Обработка сигналов в разных классах pyqt5

Существует класс Windowset, в котором есть окно с кнопкой btn. И второй класс MainWindow, в котором по нажатию кнопки btn должна выполнятся функция.

Вопрос в следующем, почему при обработке сигнала слот не обрабатывается и появляется ошибка: сигнал не имеет атрибута connect.

Большое спасибо за любые советы.

from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5 import QtWidgets
import sys

class Windowset(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

    def initUI(self):
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Input dialog')

        self.mysignal = pyqtSignal(str)
        self.btn.clicked.connect(self.pers)

    def pers(self):
        self.mysignal.emit("Привет!!!")


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Input dialog')

        self.ex1 = Windowset()
        self.ex1.mysignal.connect(self.change_ikon)

    @pyqtSlot(str)
    def change(self):
        print("a")


app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())

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

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

Правильно делать так:

from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5 import QtWidgets
import sys

class Windowset(QtWidgets.QMainWindow):
    mysignal = pyqtSignal(str)                                # <---

    def __init__(self):
        super().__init__()

        self.initUI()                                         # +++

    def initUI(self):
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)

        self.setGeometry(610, 400, 290, 150)
        self.setWindowTitle('Windowset')

#        self.mysignal = pyqtSignal(str)                       # ---
        self.btn.clicked.connect(self.pers)

    def pers(self):
        self.mysignal.emit("Привет!!!")


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Input dialog')

        self.ex1 = Windowset()
        self.ex1.mysignal.connect(self.change_ikon)
        self.ex1.show()                                         # +++

    @pyqtSlot(str)
#    def change(self):                                          # ---
    def change_ikon(self, text):                                # +++ text
        print(f"a ?, --> {text}")


app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())

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

Если что-то не понятно, спросите.

→ Ссылка