PyQt - Interfaccia a più documenti

Una tipica applicazione GUI può avere più finestre. I widget a schede e in pila consentono di attivare una di queste finestre alla volta. Tuttavia, molte volte questo approccio potrebbe non essere utile poiché la visualizzazione di altre finestre è nascosta.

Un modo per visualizzare più finestre contemporaneamente è crearle come finestre indipendenti. Questo è chiamato SDI (Single Document Interface). Ciò richiede più risorse di memoria poiché ogni finestra può avere il proprio sistema di menu, barra degli strumenti, ecc.

Le applicazioni MDI (Multiple Document Interface) consumano meno risorse di memoria. Le finestre secondarie sono disposte all'interno del contenitore principale in relazione tra loro. Viene chiamato il widget contenitoreQMdiArea.

Il widget QMdiArea generalmente occupa il widget centrale dell'oggetto QMainWondow. Le finestre figlie in quest'area sono istanze della classe QMdiSubWindow. È possibile impostare qualsiasi QWidget come widget interno dell'oggetto subWindow. Le finestre secondarie nell'area MDI possono essere disposte in cascata o in piastrelle.

La tabella seguente elenca i metodi importanti della classe QMdiArea e della classe QMdiSubWindow -

Sr.No. Metodi e descrizione
1

addSubWindow()

Aggiunge un widget come nuova sottofinestra nell'area MDI

2

removeSubWindow()

Rimuove un widget che è un widget interno di una sottofinestra

3

setActiveSubWindow()

Attiva una sottofinestra

4

cascadeSubWindows()

Dispone le sottofinestre in MDiArea in modo a cascata

5

tileSubWindows()

Dispone le sottofinestre in MDiArea in modo piastrellato

6

closeActiveSubWindow()

Chiude la sottofinestra attiva

7

subWindowList()

Restituisce l'elenco delle sottofinestre nell'area MDI

8

setWidget()

Imposta un QWidget come widget interno di un'istanza QMdiSubwindow

L'oggetto QMdiArea emette il segnale subWindowActivated () mentre il segnale windowStateChanged () viene emesso dall'oggetto QMdisubWindow.

Esempio

Nell'esempio seguente, la finestra di primo livello che comprende QMainWindow ha un menu e MdiArea.

self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")

file.addAction("New")
file.addAction("cascade")
file.addAction("Tiled")

Il segnale Triggered () del menu è collegato alla funzione windowaction ().

file.triggered[QAction].connect(self.windowaction)

La nuova azione del menu aggiunge una sottofinestra nell'area MDI con un titolo avente un numero incrementale.

MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()

I pulsanti a cascata e affiancati del menu organizzano le sottofinestre attualmente visualizzate rispettivamente in modo a cascata e piastrellato.

Il codice completo è il seguente:

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()

Il codice precedente produce il seguente output: