Как обращаться к объектам родительской формы

Допустим, есть родительская форма — ParentClass(QMainWindow) и у этой формы имеется кнопка.
При нажатии на кнопку открывается дочерняя форма — ChildClass(QWidget), а у этой формы есть своя кнопка, с помощью которой можно как-нибудь взаимодействовать с ParentClass.
Например, при нажатии кнопки в ChildClass у ParentClass в QLabel будет появляться слово "ok".

Как реализовать отправку сигналов от дочерней формы к родительской?


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

Автор решения: Pigeoncatcher

Данный ответ сформулирован искусственным интеллектом. Возможны ошибки!

Чтобы реализовать отправку сигналов из дочерней формы в родительскую форму в PyQt5, вы можете использовать метод pyqtSignal для определения сигнала в дочерней форме, а затем подключить сигнал к слоту в родительской форме с помощью метода подключения.

Вот пример того, как это можно реализовать:

from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, QApplication

class ChildClass(QWidget):
    # Define a signal that will be emitted when the button is clicked
    buttonClicked = pyqtSignal()

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

        # Create a button and connect its clicked signal to the buttonClicked signal
        button = QPushButton("Click me", self)
        button.clicked.connect(self.buttonClicked.emit)


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

        # Create a child form and a label
        self.child = ChildClass()
        self.label = QLabel("", self)

        # Connect the buttonClicked signal from the child form to the updateLabel slot
        self.child.buttonClicked.connect(self.updateLabel)

    def updateLabel(self):
        # Update the label when the buttonClicked signal is emitted
        self.label.setText("ok")


if __name__ == '__main__':
    app = QApplication([])
    w = ParentClass()
    w.show()
    app.exec_()

В этом примере сигнал buttonClicked определен в ChildClass и запускается при нажатии кнопки. Затем сигнал buttonClicked подключается к слоту updateLabel в ParentClass, который обновляет метку при запуске сигнала.

Когда вы запустите этот код и нажмете кнопку в дочерней форме, метка в родительской форме будет обновлена словом «ok».

→ Ссылка
Автор решения: S. Nick

Как вариант

from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, \
    QApplication, QMainWindow, QVBoxLayout, QLineEdit
    

class ChildClass(QWidget):
    # Define a signal that will be emitted when the button is clicked
    buttonClicked = pyqtSignal()

    def __init__(self):
        super().__init__()
        
        self.lineEdit = QLineEdit()

        # Create a button and connect its clicked signal to the buttonClicked signal
        button = QPushButton("Click me", self)
        button.clicked.connect(self.buttonClicked.emit)
        
        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.lineEdit)
        self.layout.addWidget(button)


class ParentClass(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        
        self.label = QLabel()
        
        self.pushButton = QPushButton("Click me", self)
        self.pushButton.clicked.connect(self.button_clicked)

        self.layout = QVBoxLayout(self.centralwidget)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.pushButton)

        # Create a child form and a label
        self.child = ChildClass()
        # Connect the buttonClicked signal from the child form to the updateLabel slot
        self.child.buttonClicked.connect(self.updateLabel)

    def button_clicked(self):
        self.child.show()

    def updateLabel(self):
        # Update the label when the buttonClicked signal is emitted
        self.label.setText(self.child.lineEdit.text())


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = ParentClass()
    w.resize(300, 400)
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка