PyQt5 - Çoklu Belge Arayüzü

Tipik bir GUI uygulamasının birden çok penceresi olabilir. Sekmeli ve yığılmış widget'lar, bir seferde bu tür bir pencereyi etkinleştirmeye izin verir. Ancak, diğer pencerelerin görünümü gizlendiğinden, çoğu zaman bu yaklaşım yararlı olmayabilir.

Birden çok pencereyi aynı anda görüntülemenin bir yolu, onları bağımsız pencereler olarak oluşturmaktır. Buna SDI denir(single Document Interface). Bu, her pencere kendi menü sistemine, araç çubuğuna vb. Sahip olabileceğinden daha fazla bellek kaynağı gerektirir.

MDI (Multiple Document Interface)uygulamalar daha az bellek kaynağı tüketir. Alt pencereler birbirine göre ana konteynerin içine yerleştirilir. Kapsayıcı widget'ı denirQMdiArea.

QMdiArea parçacığı genellikle QMainWondow nesnesinin merkezi parçacığını kaplar. Bu alandaki alt pencereler,QMdiSubWindowsınıf. Herhangi bir QWidget'i subWindow nesnesinin dahili bileşeni olarak ayarlamak mümkündür. MDI alanındaki alt pencereler, basamaklı veya kiremit şeklinde düzenlenebilir.

Aşağıdaki tablo, QMdiArea sınıfının ve QMdiSubWindow sınıfının önemli yöntemlerini listeler -

Sr.No. Yöntemler ve Açıklama
1

addSubWindow()

MDI alanına yeni bir alt pencere olarak bir pencere öğesi ekler

2

removeSubWindow()

Alt pencerenin dahili widget'ı olan bir widget'ı kaldırır

3

setActiveSubWindow()

Bir alt pencereyi etkinleştirir

4

cascadeSubWindows()

MDiArea'daki alt pencereleri kademeli bir şekilde düzenler

5

tileSubWindows()

MDiArea'daki alt pencereleri döşemeli bir şekilde düzenler

6

closeActiveSubWindow()

Etkin alt pencereyi kapatır

7

subWindowList()

MDI Alanındaki alt pencerelerin listesini verir

8

setWidget()

Bir QWidget'i QMdiSubwindow örneğinin dahili bir pencere öğesi olarak ayarlar

QMdiArea nesnesi subWindowActivated () sinyali yayarken windowStateChanged () sinyali QMdisubWindow nesnesi tarafından yayılır.

Misal

Aşağıdaki örnekte, QMainWindow'dan oluşan üst seviye pencere bir menüye ve MdiArea'ya sahiptir.

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

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

Menünün tetiklenen () sinyali, windowaction () işlevine bağlanır.

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

Menünün yeni eylemi, MDI alanına, kendisine artan bir sayıya sahip bir başlıkla bir alt pencere ekler.

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

Menünün basamaklı ve döşenmiş düğmeleri, o anda görüntülenen alt pencereleri sırasıyla basamaklı ve döşemeli olarak düzenler.

Kodun tamamı aşağıdaki gibidir -

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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()

Yukarıdaki kodu ve basamaklı ve döşemeli biçimde üç pencere çalıştırın -