功能描述:
在QMainWindow下,使用多個QDockWidget構成可切換,可拖動,可關閉的標簽頁;標簽頁的切換由相關聯的QAction觸發。
實現效果:
代碼如下:
1 QDockWidget *sr=new QDockWidget(tr("Sr"),this); //設置為可拖動且可關閉
2 sr->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable); 3 sr->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);//設定可停靠區域為左側與右側 4 //sr->setVisible(true);//設置為可見
5 addDockWidget(Qt::LeftDockWidgetArea,sr);//將QDockWidget加入到MainWindow中,初始位置為左側
6
7 QDockWidget *ur=new QDockWidget(tr("Ur"),this); 8 ur->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable); 9 //ur->setVisible(false);
10 ur->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); 11 ur(Qt::LeftDockWidgetArea,ur); 12 this->tabifyDockWidget(sr,ur);//此句為實現標簽頁的關鍵,意為將ur放置到sr處形成標簽頁
13
14 QDockWidget *as=new QDockWidget(tr("Setting"),this); 15 as->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable); 16 //as->setVisible(false);
17 as->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); 18 addDockWidget(Qt::LeftDockWidgetArea,as); 19 this->tabifyDockWidget(sr,as);
由代碼可見,實現標簽頁功能,只需要一句:void QMainWindow::tabifyDockWidget ( QDockWidget * first, QDockWidget * second )。
那么如何利用QAction對象關聯QDockWidget實現不同頁的切換呢?
代碼如下:
1 //toggleViewAction()函數返回與QDockWindow關聯的QAction,可控制QDockWidget關閉,隱藏及顯示。QAction *srAction = sr->toggleViewAction();
2 srAction ->setIcon(QIcon(":/images/Sr.png")); 3 connect(srAction ,SIGNAL(toggled (bool)),this,SLOT(setActiveDock(bool))); 4
5 QAction *urAction= ur->toggleViewAction(); 6 urAction->setIcon(QIcon(":/images/Ur.png")); 7 connect(urAction,SIGNAL(toggled (bool)),this,SLOT(setActiveDock(bool))); 8
9 QAction *asAction= as->toggleViewAction();asAction->setIcon(QIcon(":/images/As.png")); 10 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在標簽頁中對應頁面得到切換,還是需要用信號-槽來實現,其中關鍵代碼為:
1 as->setVisible(true); 2 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子部件類同樣適用。
1 QAction* pAction = qobject_cast<QAction*>(sender()); 2 Q_ASSERT(pAction);
接下來就可以利用pAction進行各種操作了。