zoukankan      html  css  js  c++  java
  • 在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进行各种操作了。

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

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/sfy5848/p/4835458.html
Copyright © 2011-2022 走看看