QMdiArea (Multiple Document Interface Area) 提供了一个可以同时显示多个文档窗口的区域。
区域本身是一个框架,每一个窗口都是一个 QMdiSubWindow 对象
- 也就是说: 我们自定的 widget 必须装进 QMdiSubWindow
- 相反,找的时候,也要从 QMdiSubWindow 再往下找到 widget (如果只找到QMdiSubWindow编译也会通过,并不会报错。)
设置 MDI 视图模式用 setViewModel(),有两种模式可以选择:
- QMdiArea::SubWindowView: 传统的子窗口模式
- QMdiArea::TabbedView: 多页的显示模式 (tab子窗口模式)
1. 添加 mdiArea:
setCentralWidget(ui->mdiArea);
2. 新建一个子窗口
FormDoc *formDoc = new FormDoc(this);// 因为是放到SubWindow框架里的,在关闭的时候会自动帮你回收,// 所以不需要设置WA_DeleteOnCloseui->mdiArea->addSubWindow(formDoc);formDoc->show();
3. 打开一个文档
bool needNew = false;FormDoc *formDoc;if (ui->mdiArea->subWindowList().count() > 0) {formDoc = (FormDoc *)ui->mdiArea->activeSubWindow()->widget();needNew = formDoc->isFileOpened();} else {needNew = true;}if (needNew) {formDoc = new FormDoc(this);ui->mdiArea->addSubWindow(formDoc);}// 打开文件QString fileName = QFileDialog::getOpenFileName(this,"Open","","文本文件(*.txt);;所有文件(*.*)");formDoc->loadFromFile(fileName);formDoc->show();
#include <QTextStream>#include <QFileInfo>void FormDoc::loadFromFile(QString fileName){QFile file(fileName);if (!file.open(QIODevice::ReadOnly|QIODevice::Text))return ;QTextStream stream(&file);ui->plainTextEdit->clear();ui->plainTextEdit->setPlainText(stream.readAll());file.close();mCurrentName = fileName;QFileInfo fileInfo(fileName);QString str = fileInfo.fileName();setWindowTitle(str);mFileOpened = true;}
