zabigun
@zabigun

Как установить отношения между родительским и дочерним окном в Python QT?

Так как новичек объясню своими словами, два файла один главное окно:
import sys  # sys нужен для передачи argv в QApplication
from PyQt5 import QtWidgets
import untitled  # Это наш конвертированный файл дизайна
import two

class ExampleApp(QtWidgets.QMainWindow, untitled.Ui_MainWindow):
    def __init__(self):

        super().__init__()
        self.setupUi(self)  
        self.pushButton.clicked.connect(self.browse)
        

    def browse(self):
        self.dialog =  two.Dialog(self)
        self.dialog.show()
        self.dialog.label.setText("Кнопка окна родителя") # Меняем текст

if __name__ == '__main__':  # Если мы запускаем файл напрямую, а не импортируем
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = ExampleApp()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение

И дочернее:
import sys  # sys нужен для передачи argv в QApplication
from PyQt5 import QtWidgets
import untitled2  # Это наш конвертированный файл дизайна


class Dialog(QtWidgets.QMainWindow, untitled2.Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.browse)

        
    def browse(self):
        self.label.setText("Кнопка дочернего окна")

В общем задача слейдующая по клику открывается дочернее, так же дочерней передается переменная (мне нужно будет туда передавать переменнную с подключением к базе sql, чтобы не подключаться заново), также открывается только одно дочернее окно (сейчас если нажимаешь оно каждый раз новое вылазит), при этом есле в дочке ввести что либо в lineediit например то после закрытия и повторного открытия изменения остаются. Ну и также что бы из дочки были доступны свойства виджетов родителя, например я бы мог получить текст в label

О великие гуру, помогите, подправьте код должным образом. Желательно с разъяснениями. Заранее признателен и благодарен ребятам за помощь!
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 1
chuikoalex
@chuikoalex
Викторович
Давай по задачам:
1. "открывается только одно дочернее окно" - я бы рекомендовал наследоваться не от QMainWindow, а от QDialog:
class Dialog(QtWidgets.QDialog, untitled2.Ui_Dialog):

тогда открытое окно будет блокировать родительское и ты спокойно можешь в нем работать (но если вдруг предусматривается работа в двух окнах сразу, то тогда - зачем вообще второе диалоговое окно?! делай две области в родительском и работай там)

2. "дочерней передается переменная" - у класса Dialog, в методе _init передай эту переменную:
def __init__(self, parent, connect_sql): 
    self.connect_sql = connect_sql

и всё, дальше с ней работаешь.

3. "из дочки были доступны свойства виджетов родителя" - для этого ты и передаешь в классе Dialog, в методе _init аргумент parent (= two.Dialog(self) - вот этот self это и есть ссылка на родителя) только не забудь:
def __init__(self, parent, connect_sql): 
    self.parent = parent
    self.connect_sql = connect_sql

и тогда ты сможешь обратиться к объекту родителя
self.parent.label.setText("информация передана из дочернего окна")
(предполагается конечно что у родителя есть объект label = QLable)

НО такая взаимосвязь в корне ошибочна! (читать если скучно... :))
spoiler
Пока программа маленькая ок, но как только все разрастется ты умрешь отслеживать, что от кого куда передалось и главное почему! При разработке больших приложений нужно использовать определенные паттерны в построении взаимосвязей. Model-View-Controller (MVC) - если коротко когда ты делишь все приложение на три логических объекта Модель (она занимается всеми расчетами и переработками данных), Интерфейс (View - в данном случае это библиотека QT) он получает сигналы и данные от пользователя и передает их в Модель. И Controller, который связывает Модель и Интерфейс. Причем в идеале Модель вообще ни чего не знает от двух других и просто сообщает об изменении своего состояния и готовности обработанных данных, а Контролер который подписан на Модель (паттерн Наблюдатель) следит за этими изменениями и реагирует когда нужно.


И последний совет при создании файлов интерфейсов (дизайнов) untitled всем объектам давай понятные имена, чтобы потом читая код было ясно для чего этот элемент используется.
self.button_open_dialog.clicked.connect(self.browse) - ну хотя бы как-то так (а в идеале что именно за диалог)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы