Типичное приложение с графическим интерфейсом может иметь несколько окон. Виджеты с вкладками и с накоплением позволяют активировать одно такое окно одновременно. Однако во многих случаях этот подход может оказаться бесполезным, поскольку вид других окон скрыт.
Один из способов одновременного отображения нескольких окон — это создать их как независимые окна. Это называется SDI (интерфейс с одним документом). Это требует больше ресурсов памяти, так как каждое окно может иметь свою собственную систему меню, панель инструментов и т. Д.
Приложения MDI (Multiple Document Interface) потребляют меньше ресурсов памяти. Подокна располагаются внутри основного контейнера относительно друг друга. Контейнерный виджет называется QMdiArea .
Виджет QMdiArea обычно занимает центральный виджет объекта QMainWondow. Дочерние окна в этой области являются экземплярами класса QMdiSubWindow. В качестве внутреннего виджета объекта subWindow можно установить любой QWidget. Подокна в области MDI могут быть расположены каскадно или мозаично.
В следующей таблице перечислены важные методы класса QMdiArea и класса QMdiSubWindow.
Sr.No. | Методы и описание |
---|---|
1 |
addSubWindow () Добавляет виджет как новое подокно в области MDI |
2 |
removeSubWindow () Удаляет виджет, который является внутренним виджетом подокна |
3 |
setActiveSubWindow () Активирует подокно |
4 |
cascadeSubWindows () Располагает подокна в MDiArea каскадным способом |
5 |
tileSubWindows () Располагает подокна в MDiArea плиточным способом |
6 |
closeActiveSubWindow () Закрывает активное подокно |
7 |
subWindowList () Возвращает список подокон в MDI Area |
8 |
setWidget () Устанавливает QWidget как внутренний виджет экземпляра QMdiSubwindow |
addSubWindow ()
Добавляет виджет как новое подокно в области MDI
removeSubWindow ()
Удаляет виджет, который является внутренним виджетом подокна
setActiveSubWindow ()
Активирует подокно
cascadeSubWindows ()
Располагает подокна в MDiArea каскадным способом
tileSubWindows ()
Располагает подокна в MDiArea плиточным способом
closeActiveSubWindow ()
Закрывает активное подокно
subWindowList ()
Возвращает список подокон в MDI Area
setWidget ()
Устанавливает QWidget как внутренний виджет экземпляра QMdiSubwindow
Объект QMdiArea испускает сигнал subWindowActivation (), тогда как сигнал windowStateChanged () испускается объектом QMdisubWindow.
пример
В следующем примере окно верхнего уровня, содержащее QMainWindow, имеет меню и MdiArea.
self.mdi = QMdiArea() self.setCentralWidget(self.mdi) bar = self.menuBar() file = bar.addMenu("File") file.addAction("New") file.addAction("cascade") file.addAction("Tiled")
Триггерный () сигнал меню связан с функцией windowaction ().
file.triggered[QAction].connect(self.windowaction)
Новое действие меню добавляет подокно в области MDI с заголовком, имеющим добавочный номер.
MainWindow.count = MainWindow.count+1 sub = QMdiSubWindow() sub.setWidget(QTextEdit()) sub.setWindowTitle("subwindow"+str(MainWindow.count)) self.mdi.addSubWindow(sub) sub.show()
Каскадные и мозаичные кнопки меню располагают отображаемые в данный момент подокна в каскадной и мозаичной форме соответственно.
Полный код выглядит следующим образом —
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * class MainWindow(QMainWindow): count = 0 def __init__(self, parent = None): super(MainWindow, self).__init__(parent) self.mdi = QMdiArea() self.setCentralWidget(self.mdi) bar = self.menuBar() 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": MainWindow.count = MainWindow.count+1 sub = QMdiSubWindow() sub.setWidget(QTextEdit()) sub.setWindowTitle("subwindow"+str(MainWindow.count)) self.mdi.addSubWindow(sub) sub.show() if q.text() == "cascade": self.mdi.cascadeSubWindows() if q.text() == "Tiled": self.mdi.tileSubWindows() def main(): app = QApplication(sys.argv) ex = MainWindow() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
Приведенный выше код производит следующий вывод —