在QMainWindow中利用多个QDockWidget构成标签页tab(原创)
功能描述:
在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(原创)的更多相关文章
- 利用localStorage事件来跨标签页共享sessionStorage
//干货 利用localStorage事件来跨标签页共享sessionStorage //因为cookie保存字节数量有限,很多童鞋考虑用html5 storage来保存临时数据,Sessionsto ...
- selenium控制超链接在当前标签页中打开或重新打开一个标签页
selenium控制超链接在当前标签页中打开或重新打开一个标签页 在web页面源码中,控制超链接的打开是在当前标签页还是重新打开一个标签页,是由属性target=“_black”进行控制的.如果还有属 ...
- 利用localStorage实现浏览器中多个标签页之间的通信
原理: localStorage是浏览器存储数据的容器,而且它是多页面共享的,利用localStorage多页面共享的特性,可以实现多个标签页的通信. 比如: 一个标签页发送消息(将发送的消息设置到l ...
- PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- [原创]MYSQL中利用外键实现级联删除和更新
MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- PHP中利用GD实现的柱状图
PHP中利用GD实现的柱状图,自己写的一个画柱状图的类,上代码. <?php Class Chart{ private $image; // 定义图像 private $title; // 定义 ...
- 在hexo静态博客中利用d3-cloud来展现标签云
效果: http://lucyhao.com/tags/ hexo自带的tag cloud的标签展现不太美观,想能够展现出“云”效果的标签.在网上找到了d3-cloud这个项目,github地址:ht ...
随机推荐
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- [Hadoop in Action] 第6章 编程实践
Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优 1.开发MapReduce程序 [本地模式] 本地模式 ...
- Linux实战教学笔记03:操作系统发展历程及系统版本选择
标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...
- [jquery]显示隐藏div标签的几种方法
1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...
- springMVC初始化绑定器
单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 propertyEditor为属性编辑器,此处我们选用 CustomDateEd ...
- logstash服务启动脚本
logstash服务启动脚本 最近在弄ELK,发现logstash没有sysv类型的服务启动脚本,于是按照网上一个老外提供的模板自己进行修改 #添加用户 useradd logstash -M -s ...
- Maven入门详解
什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- Linux进程管理及while循环
目录 进程的相关概念 进程查看及管理工具的使用 Linux系统作业控制 调整进程优先级 网络客户端工具 bash之while循环 20.1.进程类型 守护进程 daemon,在系统引导过程中启动的进程 ...