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_DeleteOnClose
ui->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;
}