功能描述:
在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進行各種操作了。
以上內容為原創,有錯誤歡迎指出。。。謝謝