Как создать связь между главным и всплывающим окном в Python с использованием библиотеки QT?

Как можно объяснить новичку, что два файла можно открыть в одном главном окне?
  • 7 февраля 2024 г. 14:00
Ответы на вопрос 2
Для создания связи между главным и всплывающим окном в Python, используя Qt библиотеку (например, PyQt5 или PySide2), можно использовать класс `QDialog` для всплывающего окна и класс `QMainWindow` или `QWidget` для главного окна приложения. Вот примерный процесс создания такой связи:

1. Создайте класс для вашего главного окна, наследуя от `QMainWindow` или `QWidget`.
2. Создайте класс для вашего всплывающего окна (диалога), наследуя от `QDialog`.
3. В методе главного окна определите логику, которая будет вызывать всплывающее окно.
4. При необходимости, передайте данные между главным и всплывающим окном (например, через аргументы конструктора или сигналы/слоты).

Давайте рассмотрим базовый пример:

```python
# Импортируем необходимые библиотеки
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QDialog, QVBoxLayout, QLabel

# Определение класса для всплывающего окна
class PopupWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Всплывающее окно')
        layout = QVBoxLayout()
        label = QLabel('Это всплывающее окно!')
        layout.addWidget(label)
        self.setLayout(layout)

# Определение класса для главного окна
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Главное окно')
        self.setGeometry(100, 100, 300, 200)
        button = QPushButton('Открыть всплывающее окно')
        button.clicked.connect(self.show_popup)  # Связываем кнопку с методом
        self.setCentralWidget(button)

    def show_popup(self):
        self.popup = PopupWindow()  # Создаем экземпляр всплывающего окна
        self.popup.show()  # Показываем всплывающее окно

# Создаем экземпляр приложения
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```

Чтобы объяснить новичку, что два файла могут быть открыты в одном и том же главном окне, необходимо обратить внимание на следующие моменты:

- Главное окно является основным контейнером, в рамках которого можно отображать информацию из разных источников, в том числе и файлов.
- Вы можете использовать виджеты, такие как `QTextEdit` или `QListView`, для отображения содержимого файлов внутри вашего приложения.
- Файлы могут быть загружены в виде текста, списка элементов или любого другого удобного представления.
- Вы можете использовать вкладки (`QTabWidget`) для организации открытых файлов в виде отдельных вкладок в главном окне.

Также вы можете добавить функционал, где пользователь может интерактивно открывать и закрывать файлы через требуемые диалоги, кнопки или меню.

Используя эти концепции, вы можете построить богатый пользовательский интерфейс, который позволит пользователям эффективно управлять открытием и просмотром нескольких файлов в рамках одного окна вашего приложения.
Давай по задачам: 
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)

НО такая взаимосвязь в корне ошибочна! (читать если скучно... :))

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