文章来源: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::WFlagsflags)
:QMainWindow(parent,flags)
{
ui.setupUi(this);
deleteui.tab;//删除tabWidget上默认带有的两个页签
deleteui.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()
{
}
voidQTMdi::tabCloseRequested(intindex)
{
QStringtabCaption=ui.tabWidget->tabText(index);
if(QMessageBox::question(this,tr("Message"),tr("是否要关闭页签:")+tabCaption,QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
deleteui.tabWidget->widget(index);//关闭页签并释放掉对应的widget控件对象
}
voidQTMdi::action1Triggered(boolchecked)
{
for(inti=0;i<ui.tabWidget->count();i++)//首先根据要在页签上显示的字符串查找释放已经创建了,如果已创建则将这个页签激活(显示)
if(ui.tabWidget->tabText(i)==tr("Child1"))
{
ui.tabWidget->setCurrentIndex(i);
return;
}
child1*c1=newchild1(this);//没有找到则创建一个并加入到tabWidget
ui.tabWidget->addTab(c1,tr("Child1"));
c1->showMaximized();
}
voidQTMdi::action2Triggered(boolchecked)
{
for(inti=0;i<ui.tabWidget->count();i++)
if(ui.tabWidget->tabText(i)==tr("Child2"))
{
ui.tabWidget->setCurrentIndex(i);
return;
}
child2*c2=newchild2(this);
ui.tabWidget->addTab(c2,tr("Child2"));
c2->showMaximized();
}