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

使用Qt实现MDI风格的主窗体的更多相关文章

  1. Qt 的MDI 多文档窗口

    一.MDI简介 MDI就是多文档界面(Multi-document Interface,MDI)应用程序 MDI就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口 ...

  2. Winform主窗体的设置

    软件必然涉及到一个主窗体MainForm,下面介绍一下几个简单的属性设置,可能比较有用 (1)icon,当然是咱们软件的图标了,设置上去即可 (2)isMdiContainer,这个比较重要了哦,必须 ...

  3. qt系统托盘显示、无主窗体

    系统图盘是应用程序经常用到的一个控件,当应用程序需要长时间存在的时候,这个控件会变得非常有用,比如,窗口隐藏,显示,关于.关闭等接口都可以放在图盘中处理,今天与到一个问题,需求是这样的:只需要显示图盘 ...

  4. Qt的编程风格与规范

    Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt ...

  5. PyQt5学习笔记-从主窗体打开一个子窗体

    PyQt5学习笔记-从主窗体打开一个子窗体 软件环境: Eric6+Python3.5+PyQt5 试验目标: 1.点击菜单项Open,打开一个子窗体 2.点击按钮Open,打开一个子窗体 主窗体设计 ...

  6. winform(三)——更换主窗体例子

    做一个登录窗口,登录成功时关闭form1,展示from2界面 1.主界面Login namespace WindowsFormsApplication1 { public partial class ...

  7. windows程序里新窗体不在任务栏显示,无标题拖动,键盘事件,始终显示在主窗体上面,单实例运行等

    不显示在任务栏,Alt+Tab也不显示 protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = ...

  8. Winform主窗体设计

    主窗体顶部为菜单按钮,子窗体内嵌入Panel显示 界面如下: 第二步,主窗体离不开的几个方法 1,点击菜单功能,加载子窗体 private void btnOpenForm_Click(object ...

  9. c#在主窗体panel 容器内嵌入另一个窗体(子窗体)的实现

    主窗体:  子窗体: 把子窗体嵌入到主窗体的panel 右侧中: 代码: { public MainForm() { InitializeComponent(); } private void Clo ...

随机推荐

  1. SDL2.0 学习笔记-1 windows下的第一个测试程序

    SDL全称是Simple DirectMedia Layer,是一个开源的.跨平台(win32,linux,mac)的多媒体开发c语言库. 官方网站 http://www.libsdl.org/ 第一 ...

  2. JQ无法修改input的type属性的替代解决方法

    需要实现的效果:一个输入框,当输入框未获得焦点的时候,显示为 “请输入密码”:当输入内容并失去焦点的时候,输入内容显示为”*****”,如果没有输入仍然显示“请输入密码”: 方法一:使用text,隐藏 ...

  3. HDU_2036——多边形面积,行列式计算

    Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)”话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也 ...

  4. 汉得第二次考核答案整理(通信,IO,文件等)

    1, (8 分 ) 使用程序从网上下载 pdf, 网址为http://files.saas.hand-china.com/java/target.pdf,保存在本地,编程时使用带缓冲的读写,将需要保证 ...

  5. css(二)

    重新排传智的首页!头部和左边的部分完成了! <!doctype html> <html lang="en"> <head> <meta c ...

  6. 宙斯是一个完整的Hadoop的作业平台[转]

    https://github.com/alibaba/zeus 宙斯(zeus)是什么 宙斯是一个完整的Hadoop的作业平台从Hadoop任务的调试运行到生产任务的周期调度 宙斯支持任务的整个生命周 ...

  7. Android原理揭秘系列之一动态墙纸

    Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与 ...

  8. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  9. Linux命令初步了解

    知识点: 1.虚拟控制台: 在系统启动时直接进入字符工作方式后,系统提供了多个(默认为6个)虚拟控制台.每个虚拟控制台可以相互独立使用,互不影响. 可以使用Alt+F1~Alt+F6进行多个虚拟控制台 ...

  10. asp.net读取Excel中的数据问题

      1.Microsoft.ACE.OLEDB.12.0 与Microsoft.Jet.OLEDB.4.0 在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Exc ...