PyQt5-다중 문서 인터페이스

일반적인 GUI 응용 프로그램에는 여러 개의 창이있을 수 있습니다. 탭 및 스택 위젯을 사용하면 한 번에 하나의 창을 활성화 할 수 있습니다. 그러나 다른 창보기가 숨겨져 있으므로이 방법은 유용하지 않을 수 있습니다.

여러 창을 동시에 표시하는 한 가지 방법은 독립 창으로 만드는 것입니다. 이것을 SDI라고합니다.(single Document Interface). 각 창에는 자체 메뉴 시스템, 도구 모음 등이있을 수 있으므로 더 많은 메모리 리소스가 필요합니다.

MDI (Multiple Document Interface)응용 프로그램은 더 적은 메모리 리소스를 사용합니다. 하위 창은 서로 관련하여 주 컨테이너 내부에 배치됩니다. 컨테이너 위젯이 호출됩니다.QMdiArea.

QMdiArea 위젯은 일반적으로 QMainWondow 개체의 중앙 위젯을 차지합니다. 이 영역의 자식 창은QMdiSubWindow수업. 모든 QWidget을 subWindow 객체의 내부 위젯으로 설정할 수 있습니다. MDI 영역의 하위 창은 계단식 또는 타일 방식으로 배열 할 수 있습니다.

다음 표는 QMdiArea 클래스와 QMdiSubWindow 클래스의 중요한 메소드를 나열합니다.

Sr. 아니. 방법 및 설명
1

addSubWindow()

MDI 영역에 새 하위 창으로 위젯 추가

2

removeSubWindow()

하위 창의 내부 위젯 인 위젯을 제거합니다.

setActiveSubWindow()

하위 창을 활성화합니다.

4

cascadeSubWindows()

MDiArea의 하위 창을 계단식으로 정렬합니다.

5

tileSubWindows()

MDiArea의 하위 창을 바둑판 식으로 배열합니다.

6

closeActiveSubWindow()

활성 하위 창을 닫습니다.

7

subWindowList()

MDI 영역의 하위 창 목록을 반환합니다.

8

setWidget()

QWidget을 QMdiSubwindow 인스턴스의 내부 위젯으로 설정합니다.

QMdiArea 객체는 subWindowActivated () 신호를 방출하는 반면 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")

메뉴의 Triggered () 신호는 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 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()

위의 코드와 세 개의 창을 cascased 및 tiled 형태로 실행하십시오.