文章来源: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. 【转】android小结(一)之menu

    原文网址:http://zhouyunan2010.iteye.com/blog/1151215 android提供有三种menu类型 一.Options Menu(选项菜单) 这是一组item选项的 ...

  2. Manor

    Description Bob有n个正整数,他将这n个整数根据大小划分成两部分.对于小于等于k的整数放在集合A中,其余的放在集合B中.每次他从集合B中取出一个最大的值,将其变成0放入A集合中.然后将A ...

  3. 求一个数组中第K小的数

    面试南大夏令营的同学说被问到了这个问题,我的第一反应是建小顶堆,但是据他说用的是快排的方法说是O(n)的时间复杂度, 但是后来经过我的考证,这个算法在最坏的情况下是O(n^2)的,但是使用堆在一般情况 ...

  4. POJ-魔兽世界之一:备战

    描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士.武士一共 ...

  5. sicily 1024 Magic Island

    题意:求无向图路径中的最大带权值. 解法:深搜 // Problem#: 9859 // Submission#: 2661875 // The source code is licensed und ...

  6. eclipse svn插件安装

    1,在线直接安装 help --> Eclipse Marketplace 2,下载subclipse.zip 把features.plugins拷贝到eclipse安装目录 3,直接把subc ...

  7. Linux + Apache + MySql+ Php 配置虚拟主机

    win7:------------------------------------------------------------------------ NameVirtualHost *:80&l ...

  8. form表单提交之前推断

    1.使用onsubmit方法 <form name="Form" action="t" method="post" onsubmit= ...

  9. Laravel资料

    http://laravel-cn.com/http://www.golaravel.com/docs/4.1/quick/https://github.com/search?q=Laravel&am ...

  10. Zend Framework学习日记(2)--HelloWorld篇(转)

    Zend Framework学习日记(2)--HelloWorld篇 这一篇主要演示如何用zf命令行工具建立一个基于Zend Framework框架的工程,也是我初学Zend Framework的小练 ...