在QMainWindow中利用多个QDockWidget构成标签页tab(原创)

功能描述:

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

实现效果:

代码如下:

复制代码

    QDockWidget *sr= QDockWidget(tr(),->setFeatures(QDockWidget::DockWidgetMovable|->setAllowedAreas(Qt::LeftDockWidgetArea|->setVisible(= QDockWidget(tr(),->setFeatures(QDockWidget::DockWidgetMovable|->setVisible(->setAllowedAreas(Qt::LeftDockWidgetArea|->= QDockWidget(tr(),->setFeatures(QDockWidget::DockWidgetMovable|->setVisible(->setAllowedAreas(Qt::RightDockWidgetArea|->tabifyDockWidget(sr,as);

复制代码

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

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

代码如下:

复制代码

//toggleViewAction()函数返回与QDockWindow关联的QAction,可控制QDockWidget关闭,隐藏及显示。
QAction *srAction = sr->->setIcon(QIcon()),,SLOT(setActiveDock(*urAction=  ur->->setIcon(QIcon()),,SLOT(setActiveDock(*asAction= as->->setIcon(QIcon()),,SLOT(setActiveDock()));

复制代码

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

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进行各种操作了