使用Qt实现MDI风格的主窗体

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

http://blog.csdn.net/libaineu2004/article/details/19621569

时间: 2024-10-25 08:28:12

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

QT主窗体半透明实现

QT主窗体透明实现: 1)添加setWindowFlags(windowFlags() | Qt::FramelessWindowHint); 2)添加setAttribute(Qt::WA_TranslucentBackground, true); 3)重写paintEvent事件 备注: 三者缺一不可 1)当没有设置Qt::WA_TranslucentBackground属性为true时,会发现没有半透明透明效果. 2)当窗体属性没有设置无边框属性,也就是Qt::FramelessWindo

WinForm MDi子窗体最大化导致子窗体标题栏和主窗体菜单栏合并问题的解决方法

在主窗体菜单栏的ItemAdded事件中编写如下代码: *msMain是我的主窗体菜单栏的Name属性值 //子窗体最大化不显示图标 private void msMain_ItemAdded(object sender, ToolStripItemEventArgs e) { if (e.Item.Text.Length == 0) { e.Item.Visible = false; } else { e.Item.Visible = true; } } 说明: 打开的子窗体最大化的时候,菜单

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

系统图盘是应用程序经常用到的一个控件,当应用程序需要长时间存在的时候,这个控件会变得非常有用,比如,窗口隐藏,显示,关于.关闭等接口都可以放在图盘中处理,今天与到一个问题,需求是这样的:只需要显示图盘,不需要主窗口,提示信息需要动态的改变 看似很简单的一个问题,我自己试了试之后,也倒腾了好一会儿,先看我的第一版程序,代码如下 1 QSystemTrayIcon *tc = new QSystemTrayIcon; 2 3 tc->setToolTip(QStringLiteral("消息提

Winform主窗体的设置

软件必然涉及到一个主窗体MainForm,下面介绍一下几个简单的属性设置,可能比较有用 (1)icon,当然是咱们软件的图标了,设置上去即可 (2)isMdiContainer,这个比较重要了哦,必须设置为true,那菜单调用出来的窗体就是主窗体的子窗体了哦 (3)MainMenuStrip,这是主窗体的菜单了,要选择一个咱们放到窗体上的菜单,菜单的设置后面介绍 (4)ShowInTaskBar,呵呵,设为true了,这样我们的软件运行起来就会在windows的任务栏上出现,对于大多数人来说这个

Qt的编程风格与规范

Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt_Contribution_Guidelines https://wiki.qt.io/Qt_Coding_Style https://wiki.qt.io/Coding_Conventions https://community.kde.org/Policies/Library_Code_Poli

传窗体(例子是点完修改页面的修改后,直接在主窗体显示修改后的内容,不用再点一次查询)

private void button3_Click(object sender, EventArgs e) { if(listView1.SelectedItems.Count>0) { string x = listView1.SelectedItems[0].Text; supdate f = new supdate(this,x); //this是当前窗体,就是主窗体 f.Show(); } } private Score Y; private string X; public supd

传窗体 点完修改页面的修改后,直接在主窗体显示修改后的内容

private void button3_Click(object sender, EventArgs e) { if(listView1.SelectedItems.Count>0) { string x = listView1.SelectedItems[0].Text; supdate f = new supdate(this,x); //this是当前窗体,就是主窗体 f.Show(); } } private Score Y; private string X; public supd

20151124001 关闭C#主窗体弹出是否关闭对话框

关闭C#主窗体弹出是否关闭对话框 private void Frm_Main_FormClosing(object sender, FormClosingEventArgs e)        {            DialogResult TS = MessageBox.Show("确定要关闭并退出程序?", "退出提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);            if (TS

主窗体和继承窗体

程序将第一个创建的窗体作为主窗体.如果创建了一个后,在其他窗体尚未创建的时候便释放调,此时又创建了一个窗体,那么第二次创建的窗体就会变成主窗体了. 关闭主窗体,程序就认为是终止运行,并且调用 Free 释放掉主窗体资源,进而程序结束退出.而关闭其他非主窗体,程序只是将其隐藏起来了. 子窗体会将主窗体的属性方法继承下来,对于主窗体中手动增加的方法(即声明在访问控制级别private.protected.published.public 中的方法),除非显示的增加 virtual 关键字,并在子类中