使用Qt編寫多文檔界面(MDI)應用相當方便,主要會使用到QMdiArea和QMdiSubWindow兩個類。可以查看Qt Asistant中這兩個類的說明文檔,里面介紹的相當詳細。另外,可以搜索例程"Mdi Example",這是提供的一個示例程序,這是一個多文檔編輯器,代碼很詳細,只是缺少注釋,不過很簡單,應該容易看懂。接下來,我在這里介紹最簡單、最精華的部分。
1 QMdiArea
這個類相當於一個MDI窗口管理器,用來管理添加到這個區域中的多個子窗口。我們在應用中新建的所有子窗口都需要通過addSubWindow()方法添加到其中。一般情況下,QMdiArea被用作QMainWindow的中央部件,但是,你也可以將它添加到任意的布局中。下面的代碼就是將其添加到中央部件:

1 QMainWindow *mainWindow = new QMainWindow; 2 mainWindow->setCentralWidget(mdiArea);
2 QMdiSubWindow
這個類繼承自QWidget,主要用來創建MDI子窗體實例。然后,可以通多調用QMdiArea的addSubWindow()方法將新建的子窗體實例添加到多文檔界面區域。當然,我們也可以不用QMdiSubWindow類來創建子窗體,而直接使用繼承自QWidget的類,比如下面的代碼:

1 void MainWindow::actNewWindow() 2 { 3 QLabel *label = new QLabel; 4 m_mdiArea->addSubWindow(label); 5 label->show(); 6 }
不過,使用QMdiSubWindow類的話,我們可以使用其提供的一些方便的成員方法,詳細內容請參看幫助手冊,下面給出一段示例代碼:

1 void MainWindow::actNewWindow() 2 { 3 QLabel *label = new QLabel; 4 QMdiSubWindow *subWin = new QMdiSubWindow; 5 subWin->setWidget(label); 6 subWin->setAttribute(Qt::WA_DeleteOnClose); 7 m_mdiArea->addSubWindow(subWin); 8 subWin->show(); 9 }
3 示例程序
最后,再給出一個簡單的應用示例。這個代碼中,我們使用最簡單的Qt向導創建一個QMainWindow應用。然后,在菜單中添加一個“New”菜單項,用來每次創建一個子窗體,並顯示在MDI區域。每個子窗體就是一個QLabel部件,用來顯示一個標簽。構造函數代碼如下:

1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 MainWindow::MainWindow(QWidget *parent) : 5 QMainWindow(parent), 6 ui(new Ui::MainWindow) 7 { 8 ui->setupUi(this); 9 10 //Create a MDI Area 11 m_mdiArea = new QMdiArea; 12 this->setCentralWidget(m_mdiArea); 13 14 connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(actNewWindow())); 15 }
對應的新建子窗體槽函數定義如下:

1 void MainWindow::actNewWindow() 2 { 3 QLabel *label = new QLabel(tr("MDI SubWindow!")); 4 QMdiSubWindow *subWin = new QMdiSubWindow; 5 subWin->setWidget(label); 6 subWin->setAttribute(Qt::WA_DeleteOnClose); 7 m_mdiArea->addSubWindow(subWin); 8 subWin->show(); 9 }
程序運行效果如下: