Передача сигнала из переопределенного класса QWidget. Python 3

Имеется 2 окна, код для каждой создан в отдельных файлах.

В первом окне MainMenu есть кнопка self.btn_mainMenu с помощью которой передаются данные в self.label_getData окна Window. Для упрощения кода в окно Window передаются данные из self.line_edit_1.

В окне Window кнопка self.button должна передавать сигнал и запускать метод def func(self) класса MenuWindow окна MainMenu и изменять текст self.label_1 в MainMenu. Передать сигнал от кнопки у меня не получается.

Пример кода MainMenu:

from PyQt5.QtWidgets import QWidget, QFileDialog, QComboBox
from Window import MainWindow, MyBar


class Ui_Form0(object):
    def setupUi0(self, Form0):
        Form0.setObjectName("Form0")
        Form0.setEnabled(True)
        Form0.resize(400, 300)
        Form0.setWindowOpacity(1.0)
        Form0.setToolTipDuration(-1)
        Form0.setStatusTip("")
        Form0.setStyleSheet("background-color: rgb(255, 255, 255);")

        self.label_1 = QtWidgets.QLabel('нажми на кнопку в экране <b>WINDOW</b>', Form0)
        self.label_1.setGeometry(QtCore.QRect(20, 20, 380, 30))
        self.line_edit_1 = QtWidgets.QLineEdit('введи ФИО участников', Form0)
        self.line_edit_1.setGeometry(QtCore.QRect(20, 120, 380, 30))
        self.btn_mainMenu = QtWidgets.QPushButton('SEND DATA', Form0)
        self.btn_mainMenu.setGeometry(QtCore.QRect(150, 160, 100, 20))

        self.retranslateUi(Form0)
        QtCore.QMetaObject.connectSlotsByName(Form0)

    def retranslateUi(self, Form0):
        _translate = QtCore.QCoreApplication.translate
        Form0.setWindowTitle(_translate("Form0", "Главное меню"))


class MenuWindow(QWidget, Ui_Form0):
    def __init__(self):
        super().__init__()
        self.setupUi0(self)
        self.MainWindow = MainWindow()

        # из Виджета MyBar мы передаем сигнал о нажатии кнопки self.button и применяем метод self.func
        # self.myBar = MyBar()
        # self.myBar.button.clicked.connect(self.func)

        self.btn_mainMenu.clicked.connect(self.sendData)

    def func(self):
        self.label_1.setText('КНОПКА нажата')
        print('1')

    def sendData(self):
        self.MainWindow.label_getData.setText(self.line_edit_1.text())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    ui0 = MenuWindow()
    ui0.show()
    sys.exit(app.exec_())

Пример кода Window:

from PyQt5 import QtWidgets
from PyQt5.Qt import *


class MyBar(QWidget):
    def __init__(self, parent):
        super(MyBar, self).__init__()
        self.parent = parent

        self.layout = QHBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 10, 0)
        self.title = QLabel()
        self.button = QtWidgets.QPushButton('КНОПКА')
        self.button.setFixedSize(160, 25)

        self.title.setFixedHeight(32)
        self.title.setAlignment(Qt.AlignCenter)

        self.layout.addWidget(self.title)
        self.layout.addWidget(self.button)

        self.start = QPoint(0, 0)
        self.pressing = False

    def resizeEvent(self, QResizeEvent):
        super(MyBar, self).resizeEvent(QResizeEvent)
        self.title.setFixedWidth(self.parent.width())

    def mousePressEvent(self, event):
        self.start = self.mapToGlobal(event.pos())
        self.pressing = True

    def mouseMoveEvent(self, event):
        if self.pressing:
            self.end = self.mapToGlobal(event.pos())
            self.movement = self.end - self.start
            self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
                                    self.mapToGlobal(self.movement).y(),
                                    self.parent.width(),
                                    self.parent.height())
            self.start = self.end

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.Content = QtWidgets.QFrame(self)
        self.Content.setStyleSheet("background-color: grey;")
        self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.Content.setFrameShadow(QtWidgets.QFrame.Raised)

        self.horizontalLayout = QtWidgets.QHBoxLayout(self.Content)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(0)

        self.page_1 = QtWidgets.QWidget()
        self.label_getData = QtWidgets.QLabel('ФИО участника', self.page_1)
        self.label_getData.setFixedSize(400, 25)
        self.label_getData.setStyleSheet("font-size: 20px;")

        self.horizontalLayout.addWidget(self.page_1)

        self.layout = QVBoxLayout(self)

        self.myBar = MyBar(self)

        self.layout.addWidget(self.myBar)

        self.layout.addWidget(self.Content, 1)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0)

        self.setMinimumSize(400, 200)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.show()```

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

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

Попробуйте так:

q1299455_MainMenu.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

from q1299455_Window import MainWindow                                      # --- , MyBar


class Ui_Form0(object):
    def setupUi0(self, Form0):
        Form0.setObjectName("Form0")
        Form0.setEnabled(True)
        Form0.resize(400, 300)
        Form0.setWindowOpacity(1.0)
        Form0.setToolTipDuration(-1)
        Form0.setStatusTip("")
        Form0.setStyleSheet("background-color: rgb(255, 255, 255);")

        self.label_1 = QtWidgets.QLabel('нажми на кнопку в экране <b>WINDOW</b>', Form0)
        self.label_1.setGeometry(QtCore.QRect(20, 20, 380, 30))
# +++                                                 vvvvvvvvvvvvvvv        
        self.line_edit_1 = QtWidgets.QLineEdit(Form0, placeholderText='введи ФИО участников')

        self.line_edit_1.setGeometry(QtCore.QRect(20, 120, 380, 30))
        self.btn_mainMenu = QtWidgets.QPushButton('SEND DATA', Form0)
        self.btn_mainMenu.setGeometry(QtCore.QRect(150, 160, 100, 20))

        self.retranslateUi(Form0)
        QtCore.QMetaObject.connectSlotsByName(Form0)

    def retranslateUi(self, Form0):
        _translate = QtCore.QCoreApplication.translate
        Form0.setWindowTitle(_translate("Form0", "Главное меню - MenuWindow"))


class MenuWindow(QWidget, Ui_Form0):
    def __init__(self):
        super().__init__()
        self.setupUi0(self)
        
        # не обязательно добавлять   vvvv . Сделал для автоматического закрытия окна Window
        self.mainWindow = MainWindow(self)                                   # + self
        self.mainWindow.myBar.button.clicked.connect(self.button_clicked)    # +++ !!!

        self.btn_mainMenu.clicked.connect(self.sendData)

    def func(self):
        self.label_1.setText('КНОПКА нажата')
        print('1')

    def sendData(self):
        self.mainWindow.label_getData.setText(self.line_edit_1.text())
        
    def button_clicked(self):                                                # +++
        self.func()                                                          # +++

        # void QAbstractButton::click()
        # Выполняет click
        # При необходимости излучаются все обычные сигналы, связанные с click. 
        # Если кнопка checkable, состояние кнопки переключается. 
        # Эта функция ничего не делает, если кнопка отключена.
       
        self.btn_mainMenu.click()                                            # +++


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    ui0 = MenuWindow()
    ui0.show()
    sys.exit(app.exec_())

q1299455_Window.py

from PyQt5 import QtWidgets
from PyQt5.Qt import *


class MyBar(QWidget):
    def __init__(self, parent):
        super(MyBar, self).__init__()
        self.parent = parent

        self.layout = QHBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 10, 0)
        self.title = QLabel()
        self.button = QtWidgets.QPushButton('КНОПКА')
        self.button.setFixedSize(160, 25)
        self.title.setStyleSheet("background-color: #B2AB8C;")

        self.title.setFixedHeight(32)
        self.title.setAlignment(Qt.AlignCenter)

        self.layout.addWidget(self.title)
        self.layout.addWidget(self.button)

        self.start = QPoint(0, 0)
        self.pressing = False

    def resizeEvent(self, QResizeEvent):
        super(MyBar, self).resizeEvent(QResizeEvent)
        self.title.setFixedWidth(self.parent.width())

    def mousePressEvent(self, event):
        self.start = self.mapToGlobal(event.pos())
        self.pressing = True

    def mouseMoveEvent(self, event):
        if self.pressing:
            self.end = self.mapToGlobal(event.pos())
            self.movement = self.end - self.start
            self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
                                    self.mapToGlobal(self.movement).y(),
                                    self.parent.width(),
                                    self.parent.height())
            self.start = self.end

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False


class MainWindow(QWidget):
    def __init__(self, parent=None):                                           # + parent
        super(MainWindow, self).__init__(parent)                               # + parent
        self.setMinimumSize(400, 200)
        self.move(60, 180)                                                     # +
#                           vvvvvvvvv                                   
        self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        
        
        self.Content = QtWidgets.QFrame(self)
        self.Content.setStyleSheet("background-color: grey;")
        self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.Content.setFrameShadow(QtWidgets.QFrame.Raised)

        self.horizontalLayout = QtWidgets.QHBoxLayout(self.Content)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(0)

        self.page_1 = QtWidgets.QWidget()
        self.label_getData = QtWidgets.QLabel('ФИО участника', self.page_1)
        self.label_getData.setFixedSize(400, 25)
        self.label_getData.setStyleSheet("font-size: 20px;")

        self.horizontalLayout.addWidget(self.page_1)

        self.layout = QVBoxLayout(self)

        self.myBar = MyBar(self)

        self.layout.addWidget(self.myBar)

        self.layout.addWidget(self.Content, 1)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0)

        self.show()

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

→ Ссылка