QMdiArea (Multiple Document Interface Area) 提供了一个可以同时显示多个文档窗口的区域。

区域本身是一个框架,每一个窗口都是一个 QMdiSubWindow 对象

  • 也就是说: 我们自定的 widget 必须装进 QMdiSubWindow
  • 相反,找的时候,也要从 QMdiSubWindow 再往下找到 widget (如果只找到QMdiSubWindow编译也会通过,并不会报错。)

设置 MDI 视图模式用 setViewModel(),有两种模式可以选择:

  1. QMdiArea::SubWindowView: 传统的子窗口模式
  2. QMdiArea::TabbedView: 多页的显示模式 (tab子窗口模式)

1. 添加 mdiArea:

  1. setCentralWidget(ui->mdiArea);

2. 新建一个子窗口

  1. FormDoc *formDoc = new FormDoc(this);
  2. // 因为是放到SubWindow框架里的,在关闭的时候会自动帮你回收,
  3. // 所以不需要设置WA_DeleteOnClose
  4. ui->mdiArea->addSubWindow(formDoc);
  5. formDoc->show();

3. 打开一个文档

  1. bool needNew = false;
  2. FormDoc *formDoc;
  3. if (ui->mdiArea->subWindowList().count() > 0) {
  4. formDoc = (FormDoc *)ui->mdiArea->activeSubWindow()->widget();
  5. needNew = formDoc->isFileOpened();
  6. } else {
  7. needNew = true;
  8. }
  9. if (needNew) {
  10. formDoc = new FormDoc(this);
  11. ui->mdiArea->addSubWindow(formDoc);
  12. }
  13. // 打开文件
  14. QString fileName = QFileDialog::getOpenFileName(this,
  15. "Open",
  16. "",
  17. "文本文件(*.txt);;所有文件(*.*)");
  18. formDoc->loadFromFile(fileName);
  19. formDoc->show();
  1. #include <QTextStream>
  2. #include <QFileInfo>
  3. void FormDoc::loadFromFile(QString fileName)
  4. {
  5. QFile file(fileName);
  6. if (!file.open(QIODevice::ReadOnly|
  7. QIODevice::Text))
  8. return ;
  9. QTextStream stream(&file);
  10. ui->plainTextEdit->clear();
  11. ui->plainTextEdit->setPlainText(stream.readAll());
  12. file.close();
  13. mCurrentName = fileName;
  14. QFileInfo fileInfo(fileName);
  15. QString str = fileInfo.fileName();
  16. setWindowTitle(str);
  17. mFileOpened = true;
  18. }