在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 ...
随机推荐
- 【干货分享】流程DEMO-出差申请单
流程名: 出差申请 业务描述: 员工出差前发起流程申请,流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算. ...
- NSStringCompareOptions
typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) { NSCaseInsensitiveSearch = 1, //不区分大小写比较 N ...
- Android开发案例 – 在AbsListView中使用倒计时
在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...
- (整理)MyBatis入门教程(一)
本文转载: http://www.cnblogs.com/hellokitty1/p/5216025.html#3591383 本人文笔不行,根据上面博客内容引导,自己整理了一些东西 首先给大家推荐几 ...
- 第14章 Linux启动管理(3)_系统修复模式
3. 系统修复模式 3.1 单用户模式 (1)在grub界面中选择第2项,并按"e键"进入编辑.并在"-quiet"后面加入" 1",即&q ...
- ExtJS in Review - xtype vs. alias
今天在帮一个兄弟检查一段自定义控件的代码时觉得他对xtype以及alias的使用和ExtJS各示例代码的使用有较多的不一致,而我自己也不是很清楚使用这两个属性时的最佳方法.因此在回家后整理出了这样一篇 ...
- Linux 桌面美化那点事儿
各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...
- 自己开发实现OAuth做webapi认证
看到园子里面有人写的OAuth,就想把自己实现的OAuth也分享一下,关于OAuth协议这里就不再赘述. 一.作为认证服务器,首先需要提供一个可以通过appid/appsecret来获取token这样 ...
- Visual Studio 实用扩展推荐
Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# ...
- windows10简单试用(多图,连薛定谔的猫都杀死了)
为了大家看起来方便,我的截图都是gif的,比较小,但是颜色会有色差,相信大家不介意的 昨天windows10可以下载第一时间就下了玩玩 由于是技术预览,所以不打算替换之前的系统,只装在虚拟机里玩玩就好 ...