Как можно создать в Python Qt Designer дочернее окно?

Как сделать вторую форму подчиненной первой в PyQt5 и как передать переменную из первой формы во вторую?
  • 6 февраля 2024 г. 3:49
Ответы на вопрос 2
Чтобы создать дочернее окно (или вторую форму, которая будет подчинена первой) в PyQt5, можно воспользоваться классами QDialog, QMainWindow или QWidget для создания главной и дочерних форм. Чтобы открыть дочернее окно из главного окна, можно определить слот в главном окне, который будет создавать и отображать дочернее окно. Передача переменной из первой формы во вторую может быть выполнена через инициализацию второй формы с передачей ей необходимых параметров.

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

1. Дизайн обеих форм в Qt Designer и преобразование .ui файлов в .py скрипты с помощью `pyuic5`.
2. Создание класса для главного окна.
3. Создание класса для дочернего окна.
4. Связывание сигнала нажатия кнопки в главном окне с методом, который создает и отображает дочернее окно, и передача переменной при создании его экземпляра.

Давайте рассмотрим пример кода, который иллюстрирует это:

```python
from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import QDialog

# Загрузка классов из сгенерированных python модулей с дизайном
from main_window import Ui_MainWindow  # класс из main_window.py
from child_window import Ui_ChildWindow  # класс из child_window.py

class ChildForm(QDialog):
    def __init__(self, some_data):
        super().__init__()
        self.ui = Ui_ChildWindow()
        self.ui.setupUi(self)

        # Используем переданную переменную
        self.ui.someLabel.setText(some_data)

class MainForm(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Обработка нажатия кнопки для открытия дочернего окна
        self.ui.pushButton.clicked.connect(self.open_child_window)

    def open_child_window(self):
        # Инициализация дочернего окна с передачей переменной
        data_to_pass = "Hello, Child Window!"
        self.child_window = ChildForm(data_to_pass)
        self.child_window.show()

# Запуск приложения
if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    main_window = MainForm()
    main_window.show()
    sys.exit(app.exec_())
```

В этом примере предполагается, что у вас есть два файла с оконным дизайном, скомпилированных в Python классы: `main_window.py` и `child_window.py`.

Основные моменты для внимания:

- `ChildForm` создается как подкласс `QDialog` и инициализируется с переменной `some_data`, которую потом можно использовать в методах этого класса, например, установка в лейбл.
- `MainForm` создает кнопку (или какой-то другой виджет, который будет открывать дочернее окно), к сигналу нажатия которой привязывается метод `open_child_window`, создающий и отображающий экземпляр `ChildForm`.
- Код запускает цикл обработки событий приложения, создавая экземпляр `MainForm` и отображая его.

Пожалуйста, помните, что для примеров требуется наличие соответствующих дизайнов и их предварительная компиляция из `.ui` файлов в `.py` файлы с помощью `pyuic5`.
Надо указать в качестве родителя первое окно (см. параметр parent в QMainWindow )
Похожие вопросы