PyQt5 - Giao diện nhiều tài liệu

Một ứng dụng GUI điển hình có thể có nhiều cửa sổ. Các widget được xếp theo thẻ và xếp chồng lên nhau cho phép kích hoạt một cửa sổ như vậy cùng một lúc. Tuy nhiên, nhiều khi cách tiếp cận này có thể không hữu ích vì chế độ xem các cửa sổ khác bị ẩn.

Một cách để hiển thị nhiều cửa sổ đồng thời là tạo chúng dưới dạng các cửa sổ độc lập. Đây được gọi là SDI(single Document Interface). Điều này đòi hỏi nhiều tài nguyên bộ nhớ hơn vì mỗi cửa sổ có thể có hệ thống menu, thanh công cụ, v.v.

MDI (Multiple Document Interface)ứng dụng tiêu tốn ít tài nguyên bộ nhớ hơn. Các cửa sổ phụ được đặt bên trong container chính có mối quan hệ với nhau. Tiện ích vùng chứa được gọi làQMdiArea.

Widget QMdiArea thường chiếm widget trung tâm của đối tượng QMainWondow. Cửa sổ con trong khu vực này là các phiên bản củaQMdiSubWindowlớp học. Có thể đặt bất kỳ QWidget nào làm widget bên trong của đối tượng subWindow. Các cửa sổ phụ trong khu vực MDI có thể được sắp xếp theo kiểu xếp tầng hoặc xếp lớp.

Bảng sau liệt kê các phương thức quan trọng của lớp QMdiArea và lớp QMdiSubWindow:

Sr.No. Phương pháp & Mô tả
1

addSubWindow()

Thêm tiện ích con làm cửa sổ phụ mới trong khu vực MDI

2

removeSubWindow()

Loại bỏ tiện ích con là tiện ích con bên trong của một cửa sổ con

3

setActiveSubWindow()

Kích hoạt một cửa sổ phụ

4

cascadeSubWindows()

Sắp xếp các cửa sổ phụ trong MDiArea theo kiểu xếp tầng

5

tileSubWindows()

Sắp xếp các cửa gió phụ trong MDiArea theo kiểu lát gạch

6

closeActiveSubWindow()

Đóng cửa sổ con đang hoạt động

7

subWindowList()

Trả về danh sách các cửa sổ con trong MDI Area

số 8

setWidget()

Đặt QWidget làm tiện ích nội bộ của phiên bản QMdiSubwindow

Đối tượng QMdiArea phát ra tín hiệu subWindowActiised () trong khi tín hiệu windowStateChanged () được phát ra bởi đối tượng QMdisubWindow.

Thí dụ

Trong ví dụ sau, cửa sổ cấp cao nhất bao gồm QMainWindow có menu và MdiArea.

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

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

Tín hiệu kích hoạt () của menu được kết nối với hàm windowaction ().

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

Hành động mới của menu thêm một cửa sổ con trong vùng MDI với tiêu đề có số tăng dần.

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

Các nút xếp tầng và xếp tầng của menu sắp xếp các cửa sổ con hiện đang hiển thị theo kiểu xếp tầng và xếp gạch tương ứng.

Mã hoàn chỉnh như sau:

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

Chạy mã trên và ba cửa sổ theo hình xếp tầng và xếp gạch -