文章來源:http://hi.baidu.com/wuyunju/item/3d20164c99a276f6dc0f6c52
QT提供了MDIArea控件可以很方便的實現標准的MDI窗體,但用起來並不方便.感覺像360瀏覽器一樣通過頁簽來切換子窗體的方式比較好.點擊菜單項或工具欄上的按鈕創建新的頁簽,並生成一個子窗體.點擊頁簽上的叉號關閉頁簽並釋放子窗體對象.為了實現這種風格的MDI,可以借助QT的TabWidget控件,設置其tabsClosable屬性為true,即可在頁簽上顯示叉號.點擊頁簽上的叉號時出發tabWidget控件的tabCloseRequested(int)信號,我們只需要定義一個響應的槽來處理關閉頁簽的信號即可.
#include "qtmdi.h"
QTMdi::QTMdi(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
delete ui.tab; //刪除tabWidget上默認帶有的兩個頁簽
delete ui.tab_2;
connect(ui.actionChild1, SIGNAL(triggered(bool)), this, SLOT(action1Triggered(bool)));//關聯菜單的action觸發信號的槽,創建新的子窗體
connect(ui.actionChild2, SIGNAL(triggered(bool)), this, SLOT(action2Triggered(bool)));
connect(ui.tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(tabCloseRequested(int)));//點擊頁簽上的叉號觸發
}
QTMdi::~QTMdi()
{
}
void QTMdi::tabCloseRequested(int index)
{
QString tabCaption = ui.tabWidget->tabText(index);
if(QMessageBox::question(this, tr("Message"), tr("是否要關閉頁簽:") + tabCaption, QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
delete ui.tabWidget->widget(index);//關閉頁簽並釋放掉對應的widget控件對象
}
void QTMdi::action1Triggered(bool checked)
{
for(int i = 0; i < ui.tabWidget->count(); i++)//首先根據要在頁簽上顯示的字符串查找釋放已經創建了,如果已創建則將這個頁簽激活(顯示)
if(ui.tabWidget->tabText(i) == tr("Child1"))
{
ui.tabWidget->setCurrentIndex(i);
return;
}
child1 *c1 = new child1(this);//沒有找到則創建一個並加入到tabWidget
ui.tabWidget->addTab(c1, tr("Child1"));
c1->showMaximized();
}
void QTMdi::action2Triggered(bool checked)
{
for(int i = 0; i < ui.tabWidget->count(); i++)
if(ui.tabWidget->tabText(i) == tr("Child2"))
{
ui.tabWidget->setCurrentIndex(i);
return;
}
child2 *c2 = new child2(this);
ui.tabWidget->addTab(c2, tr("Child2"));
c2->showMaximized();
}