文章来源: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中Intent的使用

    1./以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent. //一.打开一个网页,类别是Intent.ACTION_VIEW Uri uri = Uri.parse( ...

  2. 【2012长春区域赛】部分题解 hdu4420—4430

    这场比赛特点在于两个简单题太坑,严重影响了心情..导致最后只做出两题....当然也反映出心理素质的重要性 1002: 题意:一个矩阵b[n][n]通过数组 a[n]由以下规则构成,现在已知b[n][n ...

  3. win7配置简单的FTP服务器

    1.开启一些win7默认是关闭状态的功能 步骤:控制面板 -> 程序和功能 -> 打开或关闭Windows功能,然后勾选下图中圈起来的部分: 2.添加FTP站点 步骤:桌面的计算机图标 - ...

  4. HTML的表格玩法

    HTML的表格玩法 HTML也是可已展示表格的,大体结构如下 <!DOCTYPE html> <html lang="en"> <head> & ...

  5. poj 2104 K-th Number - 经典划分树

    Description You are working for Macrohard company in data structures department. After failing your ...

  6. Eclipse颜色主题插件-Eclipse Color Theme

    Eclipse颜色主题插件-Eclipse Color Theme 由于看烦了eclipse自带的的配色方案,自己动手配置又太麻烦,无意间在 http://eclipsecolorthemes.org ...

  7. ViewController详解

    一.生命周期 当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc                              创建对象,分配空间2.init (initWit ...

  8. 关于ubuntu中的软件安装

    在ubuntu中一般使用apt-get来安装软件工具, 例如 sudo apt-get install g++ apt-get会在镜像库中找到你需要的软件镜像(例如 g++)来安装,那么apt-get ...

  9. H3 BPM 笔记

    先通过流程设计器设计流程 注意  审批:1个人 会签: 多人用 同意时: 若为有一个同意就通过 则 审批选项卡 的同意出口 设为1 如果需要所有人同意才通过 则  审批选项卡 的同意出口 设为100% ...

  10. plsql编程中游标的使用

    游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. oracle中显示使用游标一般要包含以下5个步骤: 声明一些变量以便存储从游 ...