使用Qt實現MDI風格的主窗體


文章來源: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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM