主窗体上添加多个子窗口
实现多文档界面(MDI)
效果
要点
QMdiArea
QMdiArea就像是多文档窗口的窗口管理器。例如,它将它所管理的窗口绘制在它上面,并且以级联或者平铺的方式放置这些窗口。通常情况下,QMdiArea用作QMainWindow的中心控件,以此来创建一个MDI应用程序。
QMdiSubWindow
QMdiArea中的子窗口是QMdiSubWindow的实例化对象。
代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建主窗口部件
self.setWindowTitle('Example')
self.setGeometry(100, 100, 400, 400)
self.mdi_area = QMdiArea()
self.setCentralWidget(self.mdi_area)
# 创建第一个子窗口,并设置其内容
self.subwindow1 = QMdiSubWindow()
self.subwindow1.setWindowTitle('SubWindow 1')
widget1 = QWidget()
layout1 = QVBoxLayout()
label1 = QLabel('w1')
layout1.addWidget(label1)
widget1.setLayout(layout1)
self.subwindow1.setWidget(widget1)
self.mdi_area.addSubWindow(self.subwindow1)
subwindow1_width = 200
subwindow1_height = 400
self.subwindow1.resize(subwindow1_width, subwindow1_height)
# 创建第二个子窗口,并设置其内容
self.subwindow2 = QMdiSubWindow()
self.subwindow2.setWindowFlags(Qt.FramelessWindowHint)
# self.subwindow2.setWindowTitle('SubWindow 2')
widget2 = QWidget()
layout2 = QVBoxLayout()
label2 = QLabel('w2,这是一个无边框子窗口')
layout2.addWidget(label2)
widget2.setLayout(layout2)
self.subwindow2.setWidget(widget2)
self.mdi_area.addSubWindow(self.subwindow2)
subwindow2_width = 200
subwindow2_height = 400
self.subwindow2.resize(subwindow2_width, subwindow2_height)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())