功能描述:

在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. (一)Spark简介-Java&Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

  2. 通过squid 禁止访问/只允许访问指定 网址

    安装 squid yum install squid -y 备份squid.conf cp  squid.conf  squid.conf-list vi  squid.conf 输入: acl de ...

  3. FineReport如何用JDBC连接阿里云ADS数据库

    在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...

  4. No plugin found for prefix ‘jetty’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories

    maven配置文件(最大的那个)的<pluginGroups></pluginGroups>增加一行如下<pluginGroups><pluginGroup& ...

  5. ubuntu 启动MySql和安装python的MySQLdb模块

    ubuntu一般会自己预安装mysql,你只需 /etc/init.d/mysql start|stop|restart|reload|force-reload|status  命令便可以实现mysq ...

  6. 不使用Ajax,如何实现表单提交不刷新页面

    不使用Ajax,如何实现表单提交不刷新页面? 目前,我想到的是使用<iframe>,如果有其他的方式,后续再补. 举个栗子: 在表单上传文件的时候必须设置enctype="mul ...

  7. angular + easyui 做界面验证

    angular结合easyui这事其实并不是很合适,因为:angular的特点之一是双向绑定,页面元素与页面逻辑之间解耦:easyui是对页面元素进行封装,甚至一些组件是隐藏了原本的dom元素,初始化 ...

  8. c#如何判断webbrowser已经加载完毕

    最近有个小程序需要采集网页源代码,但有的网页中JS脚本又会生成额外的代码,比如http://www.cnblogs.com/lidabo/p/4169396.html 红框部分便是另外加载的代码. 此 ...

  9. 实验:Oracle直接拷贝物理存储文件迁移

    实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...

  10. 记一次nginx部署yii2项目时502 bad gateway错误的排查

    周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在 ...