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 형태로 실행하십시오.