Шаг 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):
- addSubWindow (<QWidget>[, flags=0]) - создает вложенное окно с флагами flags (смотри 25 шаг),
добавляет в него заданный в первом параметре компонент и возвращает ссылку на созданное окно (экземпляр класса QMdiSubWindow). Пример:
w = MyWidget()
sWindow = self.mdi_area.addSubWindow(w)
sWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose)
# ... Задаем параметры окна
sWindow.show()
Чтобы окно автоматически удалялось при закрытии, необходимо установить атрибут WA_DeleteOnClose, а чтобы отобразить окно, - вызвать метод show().
В первом параметре этого метода также можно указать ссылку на существующее вложенное окно (экземпляр класса QMdiSubWindow). Пример:
w = MyWidget()
sWindow = QtWidgets.QMdiSubWindow()
self.radi_area.addSubWindow(sWindow)
sWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose)
# ... Производим настройку свойств окна
sWindow.setWidget(w)
sWindow.show()
Также можно добавить вложенное окно в MDI-область, указав последнюю в качестве родителя при создании объекта вложенного окна. Пример:
sWindow = QtWidgets.QMdiSubWindow(self.mdi_area)
- activeSubWindow () - возвращает ссылку на активное вложенное окно (экземпляр класса QMdiSubWindow) или значение None;
- currentSubWindow () - возвращает ссылку на текущее вложенное окно (экземпляр класса QMdiSubWindow) или значение None. Результат выполнения этого метода
аналогичен таковому у метода activeSubWindow(), если MDI-область находится в активном окне;
- subWindowList ([order=CreationOrder]) - возвращает список со ссылками на все вложенные окна (экземпляры класса QMdiSubWindow), добавленные в MDI-область, или пустой список.
В параметре order указываются следующие атрибуты класса QMdiArea:
- CreationOrder (или 0) - окна в списке располагаются в порядке их создания;
- StackingOrder (или 1) - окна в списке располагаются в порядке размещения их на экране. Последний элемент в списке будет содержать ссылку на самое верхнее окно, а последний - ссылку на самое нижнее окно;
- ActivationHistoryOrder (или 2) - окна в списке располагаются в порядке истории получения фокуса. Последний элемент в списке будет содержать ссылку на окно, получившее фокус последним;
- removeSubWindow (<QWidget>) - удаляет вложенное окно из MDI-области;
- setActiveSubWindow (<QMdiSubWindow>) - делает указанное вложенное окно активным. Если задать значение None, все вложенные окна станут неактивными. Метод является слотом;
- setActivationOrder (<Порядок>) - задает порядок передачи фокуса при использовании методов activatePreviousSubWindow(), activateNextSubWindow() и др.
В параметре указываются те же атрибуты, что и в параметре метода subWindowList();
- activationOrder () - возвращает порядок передачи фокуса;
- activatePreviousSubWindow () - делает активным предыдущее вложенное окно. Метод является слотом. Порядок передачи фокуса устанавливается с помощью метода setActivationOrder();
- activateNextSubWindow () - делает активным следующее вложенное окно. Метод является слотом. Порядок передачи фокуса устанавливается с помощью метода setActivationOrder();
- closeActiveSubWindow () - закрывает активное вложенное окно. Метод является слотом;
- closeAllSubWindows () - закрывает все вложенные окна. Метод является слотом;
- cascadeSubWindows () - выстраивает вложенные окна в виде стопки. Метод является слотом;
- tileSubWindows () - выстраивает вложенные окна в виде мозаики. Метод является слотом;
- setViewMode (<Режим>) - задает режим отображения вложенных окон в MDI-области. В параметре <Режим> указываются следующие атрибуты класса QMdiArea:
- SubWindowView (или 0) - в виде собственно окон (по умолчанию);
- TabbedView (или 1) - в виде отдельных вкладок на панели с вкладками;
- viewMode () - возвращает режим отображения вложенных окон в MDI-области;
- setTabPosition ( <Позиция>) - задает позицию отображения заголовков вкладок при использовании режима TabbedView. По умолчанию заголовки вкладок отображаются сверху.
В качестве параметра <Позиция> могут быть указаны следующие атрибуты класса QTabWidget:
- North (или 0) - сверху;
- South (или 1) - снизу;
- West (или 2) - слева;
- East (или 3) - справа;
- tabPosition (<Область>) - возвращает позицию отображения заголовков вкладок при использовании режима TabbedView;
- setTabShape (<Форма>) - задает форму углов ярлыков вкладок при использовании режима TabbedView. Могут быть указаны следующие атрибуты класса QTabWidget:
- Rounded (или 0) - скругленные углы (значение по умолчанию);
- Triangular (или 1) - треугольная форма;
- tabShape () - возвращает форму углов ярлыков вкладок в области заголовка при использовании режима TabbedView;
- setTabsMovable (<Флаг>) - если передано значение True, вкладки на панели при использовании режима TabbedView можно перемещать мышью;
- setTabsClosable (<Флаг>) - если передано значение True, вкладки на панели при использовании режима TabbedView можно закрывать щелчком на расположенной в заголовке вкладки кнопке закрытия;
- setBackground (<QBrush>) - задает кисть для заполнения фона MDI-области;
- setOption (<Опция>[, on=True]) - если во втором параметре указано значение True, заданная в первом параметре опция будет установлена, если False - сброшена. В параметре
<Опция> может быть указан атрибут DontMaximizeSubWindowOnActivation класса QMdiArea, в случае установки запрещающий автоматически разворачивать следующее
вложенное окно при переключении на него из уже развернутого окна;
- testOption ((<Опция>) - возвращает значение True, если указанная опция установлена, и False - в противном случае.
Класс 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.
Предыдущий шаг
Содержание
Следующий шаг