Qt QMainWindow中利用多個QDockWidget構成標簽頁tab || tabifyDockWidget


功能描述:

在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進行各種操作了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM