Шаг 284.
Библиотека PyQt5.
Создание SDI- и MDI-приложений. MDI-приложения. Класс QMdiArea

    На этом шаге мы рассмотрим иерархию наследования этого класса, формат конструктора и перечислим основные методы.

    Класс QMdiArea реализует MDI-область, внутри которой могут располагаться вложенные окна (экземпляры класса QMdiSubWindow). Иерархия наследования для класса QMdiArea выглядит так:

  (QObject, QPaintDevice)  - QWidget - QFrame -
             QAbstractScrollArea - QMdiArea

    Конструктор класса QMdiArea имеет следующий формат:

  <Объект> = QMdiArea([parent=None])

    В параметре parent указывается ссылка на родительское окно.

    Класс QMdiArea поддерживает следующие методы (здесь приведены только основные - полный их список доступен на странице https://doc.qt.io/qt-5/qmdiarea.html):

    Класс QMdiArea поддерживает сигнал subWindowActivated(<QMdiSubWindow>), генерируемый при активизации другого вложенного окна. В обработчике через параметр доступна ссылка на активизированное вложенное окно или значение None.

    В заключение приведем небольшой пример создания MDI-приложения. В нем будут создаваться окна и менять свое расположение.

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QMdiArea, QAction, 
         QMdiSubWindow, QTextEdit


class Example(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)
        bar = self.menuBar()
        self.count = 0
		
        file = bar.addMenu("File")
        file.addAction("New")
        file.addAction("Cascade")
        file.addAction("Tiled")
        file.triggered[QAction].connect(self.windowaction)
        self.setWindowTitle("MDI demo")
    		
    def windowaction(self, q):
        print("triggered")

        if q.text() == "New":
            self.count = self.count + 1
            sub = QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("subwindow" + str(self.count))
            self.mdi.addSubWindow(sub)
            sub.show()
        if q.text() == "Cascade":
            self.mdi.cascadeSubWindows()
        if q.text() == "Tiled":
            self.mdi.tileSubWindows()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
Архив с файлом можно взять здесь.

    Результат работы приложения показан на рисунке 1.


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим класс QMdiSubWindow.




Предыдущий шаг Содержание Следующий шаг