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

最新文章

  1. 数据库邮件服务器中sp_send_dbmail的参数使用
  2. 7月17日——高校就业信息网站功能及数据获取之python爬虫
  3. csharp: MVC Controls
  4. 75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]
  5. 嵌入式Linux的FTP服务端软件(stupid-ftpd)
  6. python中的remove趣谈
  7. Windows Server Backup 备份Hypver-V VM
  8. 【二进制】FZU 2062 Suneast &amp; Yayamao
  9. [Everyday Mathematics]20150102
  10. delphi xe5 android listbox的 TMetropolisUIListBoxItem
  11. javascript实现无缝上下滚动(转)
  12. cocos2d-x过程动作CCProgressTo示例学习笔记
  13. 用JS实现发邮件的功能 完美解决
  14. Java 测试并行编程(三)
  15. Python+Selenium WebDriver API:浏览器及元素的常用函数及变量整理总结
  16. [Leetcode]674. Longest Continuous Increasing Subsequence
  17. linux查找指定目录文件大小
  18. ICSE 2018 论文
  19. Redis数据类型和常用命令
  20. Android Studio找不到FragmentActivity类

热门文章

  1. 抛出异常的区别 throw 和throw ex
  2. 如何在Excel中启用宏?
  3. Java---设计模块(工厂方法)
  4. phpstorm + xdebug 配置
  5. GitHub托管BootStrap资源汇总
  6. LDAP错误代码221
  7. Win7_x64下卸载Oracle11g
  8. git开源项目协作
  9. (转)在Repeater中嵌套使用Repeater
  10. SqlServer 开启或关闭数据库主键自增