轉載: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。