Учебники

PyQt – многодокументный интерфейс

Типичное приложение с графическим интерфейсом может иметь несколько окон. Виджеты с вкладками и с накоплением позволяют активировать одно такое окно одновременно. Однако во многих случаях этот подход может оказаться бесполезным, поскольку вид других окон скрыт.

Один из способов одновременного отображения нескольких окон – это создать их как независимые окна. Это называется 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()

Приведенный выше код производит следующий вывод –