Найти в Дзене
programmer's notes (python and more)

Программироание на языке python. Библиотека PyQt5. Подокна в QMainWindow, классы QMdiArea и QMdiSubWindow

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео. Классы QMdiArea и QMdiSubWindow. Подокна в QMainWindow Из главного окна всегда можно создать дочерние окна модальные или немодальные. И тот и другой вариант обладает недостатком: Хотелось бы иметь окна, которые были бы привязаны к главному окну и в тоже время не блокировали бы другие окна. Общая идея работы с подокнами заключается в следующим. Есть класс QMdiArea. Это класс - контейнер. Создается объект этого класса и привязывается к главному окну. А далее можно создавать произвольное количество подокон на основе класса QMdiSubWindow, которые помещаются в данный контейнер. Надо сказать, что подокно QMdiSubWindow обладает всеми возможностями обычного окна, т.е. может иметь разные элементы. В результате мы получим несколько окон в пределах главного окна со своим функционалом. При создании большого приложения это не плохое решение. Кроме

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Классы QMdiArea и QMdiSubWindow. Подокна в QMainWindow

Из главного окна всегда можно создать дочерние окна модальные или немодальные. И тот и другой вариант обладает недостатком:

  • Модальное окно блокирует все остальные окна приложения и это не всегда удобно, по-крайней мере может не отражать желания заказчика.
  • Немодальные окна могут перемещаться по всему экрану и могут перемешиваться с окнами других приложений, что тоже не очень удобно.

Хотелось бы иметь окна, которые были бы привязаны к главному окну и в тоже время не блокировали бы другие окна.

Общая идея работы с подокнами заключается в следующим. Есть класс QMdiArea. Это класс - контейнер. Создается объект этого класса и привязывается к главному окну. А далее можно создавать произвольное количество подокон на основе класса QMdiSubWindow, которые помещаются в данный контейнер. Надо сказать, что подокно QMdiSubWindow обладает всеми возможностями обычного окна, т.е. может иметь разные элементы. В результате мы получим несколько окон в пределах главного окна со своим функционалом. При создании большого приложения это не плохое решение. Кроме того:

  • Подокна не загораживают элементы главного окна.
  • Контейнер QMdiArea упорядочивает определённым образом окна при создании (см. Рисунок 1) и имеет дополнительные возможности вносить порядок в содержащиеся в нём окна (см. Рисунки 2 и 3).

Пример программы с главным окном и кнопками создания субокна, каскадным и плиточным упорядочиванием.

Скриншот программы. Полный текст программы см. ниже по ссылке
Скриншот программы. Полный текст программы см. ниже по ссылке
primer262.py

Пояснения к программе

  • Создаётся главное окно на основе класса QMainWindow (см. статью).
  • В окне создаются три кнопки QPusgButton: Окно, Каскад, Плитка. Первая кнопка создаёт очередное подокно, две другие упорядочивают окна.
  • Создаётся контейнер класса QMdiArea. В нём будут располагаться подокна. Привязка контейнера к основному окну осуществляется методом QMainWindow.setCentralWidget(). Что означает, что контейнер будет располагаться в центральной части окна.
  • Для создания подокон создаётся класс mdi наследующий от класса MdiSubWindow. В подокне создаётся кнопка и поле ввода. Подокна могут свободно перемещаться мышью в пределах главного окна и удаляться обычным для окон способом.
  • Каскадное расположение окон создаётся методом QMdiArea.cascadeSubWindows().
  • Расположение плиткой осуществляется методом QMdiArea.tileSubWindows().
  • Ну а строчки
    pl = QPalette()
    pl.setColor(QPalette.Background, QColor(100, 226, 226))
    self.setPalette(pl)

    должны быть вам понятны
Рисунок 1. При создании подокон они сразу располагаются в пространстве упорядоченно
Рисунок 1. При создании подокон они сразу располагаются в пространстве упорядоченно

Рисунок 2. Каскадное упорядочивание подокон
Рисунок 2. Каскадное упорядочивание подокон

Рисунок 3. Упорядочение "плитка" (tile)
Рисунок 3. Упорядочение "плитка" (tile)

Ну, пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Из окна я вижу множество окон
Из окна я вижу множество окон