PyQt5 - Antarmuka Beberapa Dokumen

Aplikasi GUI yang khas mungkin memiliki banyak jendela. Widget bertab dan bertumpuk memungkinkan untuk mengaktifkan satu jendela seperti itu dalam satu waktu. Namun, seringkali pendekatan ini tidak berguna karena tampilan jendela lain disembunyikan.

Salah satu cara untuk menampilkan banyak jendela secara bersamaan adalah dengan membuatnya sebagai jendela independen. Ini disebut sebagai SDI(single Document Interface). Ini membutuhkan lebih banyak sumber daya memori karena setiap jendela mungkin memiliki sistem menu, bilah alat, dll.

MDI (Multiple Document Interface)aplikasi mengkonsumsi sumber daya memori yang lebih sedikit. Sub jendela diletakkan di dalam wadah utama dengan hubungan satu sama lain. Widget penampung dipanggilQMdiArea.

Widget QMdiArea umumnya menempati widget pusat objek QMainWondow. Jendela anak di area ini adalah contohQMdiSubWindowkelas. Dimungkinkan untuk menyetel QWidget apa pun sebagai widget internal objek subWindow. Sub-jendela di area MDI dapat diatur dalam gaya bertingkat atau ubin.

Tabel berikut mencantumkan metode penting kelas QMdiArea dan kelas QMdiSubWindow -

Sr.No. Metode & Deskripsi
1

addSubWindow()

Menambahkan widget sebagai subwindow baru di area MDI

2

removeSubWindow()

Menghapus widget yang merupakan widget internal subwindow

3

setActiveSubWindow()

Mengaktifkan subwindow

4

cascadeSubWindows()

Atur subwindows di MDiArea secara bertingkat

5

tileSubWindows()

Atur subwindows di MDiArea dengan gaya ubin

6

closeActiveSubWindow()

Menutup subwindow aktif

7

subWindowList()

Mengembalikan daftar subwindows di MDI Area

8

setWidget()

Menyetel QWidget sebagai widget internal dari instance QMdiSubwindow

Objek QMdiArea memancarkan sinyal subWindowActivated () sedangkan sinyal windowStateChanged () dipancarkan oleh objek QMdisubWindow.

Contoh

Dalam contoh berikut, jendela tingkat atas yang terdiri dari QMainWindow memiliki menu dan MdiArea.

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

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

Sinyal Triggered () dari menu terhubung ke fungsi windowaction ().

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

Tindakan baru menu menambahkan subwindow di area MDI dengan judul yang memiliki nomor tambahan.

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

Tombol bertingkat dan berubin dari menu mengatur subwindows yang sedang ditampilkan masing-masing dalam mode bertingkat dan berubin.

Kode lengkapnya adalah sebagai berikut -

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

Jalankan kode di atas dan tiga jendela dalam formasi bertingkat dan ubin -