Qt5布局管理(二)——QDockWidget停靠窗口類


 

轉載:LeeHDsniper

停靠窗口類QDockWidget

實例效果

如右圖所示,左半部分MainWindow是該窗口的中心窗口,右邊的最下面兩個停靠窗口可以跳出該窗口:

但是第一個停靠窗口只能停靠在右邊或者左邊,不能跳出。
同時各個窗口的大小可以調節。
另外,各個窗口可以合並:

重要代碼

 1 #include "dockwindows.h"
 2 #include <QTextEdit>
 3 #include <QDockWidget>
 4 DockWindows::DockWindows(QWidget *parent)
 5     : QMainWindow(parent)
 6 {
 7     setWindowTitle(tr("DockWindows"));//設置主窗口的標題欄文字
 8     QTextEdit *te=new QTextEdit(this);//定義一個QTextEdit對象作為主窗口
 9     te->setText(tr("Main Window"));
10     te->setAlignment(Qt::AlignCenter);
11     setCentralWidget(te);             //將此編輯框作為主窗體的中央窗體
12     //停靠窗口1
13     QDockWidget *dock1=new QDockWidget(tr("DockWindow1"),this);
14     QDockWidget *dock2=new QDockWidget(tr("DockWindow2"),this);
15     QDockWidget *dock3=new QDockWidget(tr("DockWindow3"),this);
16     //可移動
17     dock1->setFeatures(QDockWidget::DockWidgetMovable);
18     dock1->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
19     QTextEdit *te1=new QTextEdit();
20     te1->setText(tr("Window1,The dock widget can be moved between dicks by user" ""));
21     dock1->setWidget(te1);
22     addDockWidget(Qt::RightDockWidgetArea,dock1);
23     //停靠窗口2
24     //dock2=new QDockWidget(tr("DockWindow2"),this);
25     dock2->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
26     QTextEdit *te2=new QTextEdit();
27     te2->setText(tr("Window2,The dock widget can be detached from the main window,"
28                    """and floated as an independent window,and can be closed" ));
29     dock2->setWidget(te2);
30     addDockWidget(Qt::RightDockWidgetArea,dock2);
31     //停靠窗口3
32     //dock3=new QDockWidget(tr("DockWindow3"),this);
33     dock3->setFeatures(QDockWidget::AllDockWidgetFeatures);
34     QTextEdit *te3=new QTextEdit();
35     te3->setText(tr("Window3,The dock widget can be closed,moved,add floated"));
36     dock3->setWidget(te3);
37     addDockWidget(Qt::RightDockWidgetArea,dock3);
38 }
39 
40 DockWindows::~DockWindows()
41 {
42 
43 }

1.line 17:dock1->setFeatures(QDockWidget::DockWidgetMovable); 這個函數設置停靠窗口是否可移動,可關閉,可懸浮。
在這個持續中,第一個停靠窗口只能移動,第二個窗口不可移動,也就是說它只能懸浮或者關閉,不能出現在第一個或者第三個停靠窗口的位置。

第三個窗口則具備了上述所有屬性。下面是Qt文檔的解釋:

This property holds whether the dock widget is movable, closable, and floatable. 
By default, this property is set to a combination of DockWidgetClosable, DockWidgetMovable and DockWidgetFloatable.

2.QDockWidget的隱式共享
在前面講QString時提到了隱式共享,其實隱式共享同樣支持所有的容器類,QDockWidget就是其中之一。
可以看到,我定義了三個QDockWidget對象:dock1,dock2,dock3。事實上,只需要一個QDockWidget對象就足夠了,只需要在每個停靠窗口初始化的時候重新初始化這個dock對象。 那么就會出現一個問題:
addDockWidget(Qt::RightDockWidgetArea,dock2);
這段代碼中(出現了三次),如果只用一個dock,會不會使已定義的dock對象不見了?如果這個dock是C++中的一個引用的話,確實會導致對象被覆蓋。但是Qt的隱式共享解決了這個問題,有關隱式共享的問題之前已經解釋過了:http://blog.csdn.net/leehdsniper/article/details/50975227

 


免責聲明!

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



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