功能描述:

在QMainWindow下,使用多个QDockWidget构成可切换,可拖动,可关闭的标签页;标签页的切换由相关联的QAction触发。

实现效果:

代码如下:

    QDockWidget *sr=new QDockWidget(tr("Sr"),this);
  //设置为可拖动且可关闭
sr->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable);
sr->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);//设定可停靠区域为左侧与右侧
//sr->setVisible(true);//设置为可见
addDockWidget(Qt::LeftDockWidgetArea,sr);//将QDockWidget加入到MainWindow中,初始位置为左侧 QDockWidget *ur=new QDockWidget(tr("Ur"),this);
ur->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable);
//ur->setVisible(false);
ur->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
ur(Qt::LeftDockWidgetArea,ur);
this->tabifyDockWidget(sr,ur);//此句为实现标签页的关键,意为将ur放置到sr处形成标签页 QDockWidget *as=new QDockWidget(tr("Setting"),this);
as->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable);
//as->setVisible(false);
as->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
addDockWidget(Qt::LeftDockWidgetArea,as);
this->tabifyDockWidget(sr,as);

由代码可见,实现标签页功能,只需要一句:void QMainWindow::tabifyDockWidget ( QDockWidget * first, QDockWidget * second )。

那么如何利用QAction对象关联QDockWidget实现不同页的切换呢?

代码如下:

//toggleViewAction()函数返回与QDockWindow关联的QAction,可控制QDockWidget关闭,隐藏及显示。
QAction *srAction = sr->toggleViewAction();
srAction ->setIcon(QIcon(":/images/Sr.png"));
connect(srAction ,SIGNAL(toggled (bool)),this,SLOT(setActiveDock(bool))); QAction *urAction= ur->toggleViewAction();
urAction->setIcon(QIcon(":/images/Ur.png"));
connect(urAction,SIGNAL(toggled (bool)),this,SLOT(setActiveDock(bool))); QAction *asAction= as->toggleViewAction();
asAction->setIcon(QIcon(":/images/As.png"));
connect(asAction,SIGNAL(toggled (bool)),this,SLOT(setActiveDock(bool)));

以上代码中,关键的一句是

QAction * QDockWidget::toggleViewAction () const,这个函数直接返回了一个与QDockWindow对象一对一关联的QAction,不用我们另外再建立QAction对象与其建立connect连接。
另外,这里面有一个setActiveDock(bool checked)函数,这是我自己定义的槽函数,功能是随着每个QAction的选中/未选中状态,使对应的QDockWidget显示/隐藏,即标签页中的不同页得到显示/隐藏。 同时,需要注意的是,当QDockWidget状态为不可见时,选中QAction并不能直接使其可见,只会在标签页中多出其对应的标签项而已,而页面并不会切换,并且利用
isVisible()函数查看QDockWidget状态为false.
而如若要相应的QDockWidget在标签页中对应页面得到切换,还是需要用信号-槽来实现,其中关键代码为:
as->setVisible(true);
as->raise();
raise()函数————官方解释:Raises this widget to the top of the parent widget's stack. After this call the widget will be visually in front of any overlapping sibling widgets.
但需要注意的是,在使用raise()前,需保证QDockWidget是可见的,否则无效;
而单独使用setVisible(true)并不能使页面显示出来。 同时,有两句语句特别值得记录,通过以下两句可以确定发射signal的QAction对象,这里面把QAction换成其他QObject子部件类同样适用。
  QAction* pAction = qobject_cast<QAction*>(sender());
Q_ASSERT(pAction);

接下来就可以利用pAction进行各种操作了。

以上内容为原创,有错误欢迎指出。。。谢谢

在QMainWindow中利用多个QDockWidget构成标签页tab(原创)的更多相关文章

  1. 利用localStorage事件来跨标签页共享sessionStorage

    //干货 利用localStorage事件来跨标签页共享sessionStorage //因为cookie保存字节数量有限,很多童鞋考虑用html5 storage来保存临时数据,Sessionsto ...

  2. selenium控制超链接在当前标签页中打开或重新打开一个标签页

    selenium控制超链接在当前标签页中打开或重新打开一个标签页 在web页面源码中,控制超链接的打开是在当前标签页还是重新打开一个标签页,是由属性target=“_black”进行控制的.如果还有属 ...

  3. 利用localStorage实现浏览器中多个标签页之间的通信

    原理: localStorage是浏览器存储数据的容器,而且它是多页面共享的,利用localStorage多页面共享的特性,可以实现多个标签页的通信. 比如: 一个标签页发送消息(将发送的消息设置到l ...

  4. PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...

  5. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  6. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  7. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  8. PHP中利用GD实现的柱状图

    PHP中利用GD实现的柱状图,自己写的一个画柱状图的类,上代码. <?php Class Chart{ private $image; // 定义图像 private $title; // 定义 ...

  9. 在hexo静态博客中利用d3-cloud来展现标签云

    效果: http://lucyhao.com/tags/ hexo自带的tag cloud的标签展现不太美观,想能够展现出“云”效果的标签.在网上找到了d3-cloud这个项目,github地址:ht ...

随机推荐

  1. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  2. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  3. [Hadoop in Action] 第6章 编程实践

    Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优   1.开发MapReduce程序   [本地模式]        本地模式 ...

  4. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  5. [jquery]显示隐藏div标签的几种方法

    1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...

  6. springMVC初始化绑定器

    单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   propertyEditor为属性编辑器,此处我们选用 CustomDateEd ...

  7. logstash服务启动脚本

    logstash服务启动脚本 最近在弄ELK,发现logstash没有sysv类型的服务启动脚本,于是按照网上一个老外提供的模板自己进行修改 #添加用户 useradd logstash -M -s ...

  8. Maven入门详解

    什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...

  9. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  10. Linux进程管理及while循环

    目录 进程的相关概念 进程查看及管理工具的使用 Linux系统作业控制 调整进程优先级 网络客户端工具 bash之while循环 20.1.进程类型 守护进程 daemon,在系统引导过程中启动的进程 ...