Qt5佈局管理(二)——QDockWidget停靠視窗類

Qt5佈局管理(二)——QDockWidget停靠視窗類

停靠視窗類QDockWidget

Code @github:https://github.com/LeeHDsniper/LearnQt/tree/master/CH302

例項效果

這裡寫圖片描述
如右圖所示,左半部分MainWindow是該視窗的中心視窗,右邊的最下面兩個停靠視窗可以跳出該視窗:
這裡寫圖片描述
但是第一個停靠視窗只能停靠在右邊或者左邊,不能跳出。
同時各個視窗的大小可以調節。
另外,各個視窗可以合併:
這裡寫圖片描述

重要程式碼

#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>
DockWindows::DockWindows(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("DockWindows"));//設定主視窗的標題欄文字
QTextEdit *te=new QTextEdit(this);//定義一個QTextEdit物件作為主視窗
te->setText(tr("Main Window"));
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te);             //將此編輯框作為主窗體的中央窗體
//停靠視窗1
QDockWidget *dock1=new QDockWidget(tr("DockWindow1"),this);
QDockWidget *dock2=new QDockWidget(tr("DockWindow2"),this);
QDockWidget *dock3=new QDockWidget(tr("DockWindow3"),this);
//可移動
dock1->setFeatures(QDockWidget::DockWidgetMovable);
dock1->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
QTextEdit *te1=new QTextEdit();
te1->setText(tr("Window1,The dock widget can be moved between dicks by user" ""));
dock1->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea,dock1);
//停靠視窗2
//dock2=new QDockWidget(tr("DockWindow2"),this);
dock2->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
QTextEdit *te2=new QTextEdit();
te2->setText(tr("Window2,The dock widget can be detached from the main window,"
"""and floated as an independent window,and can be closed" ));
dock2->setWidget(te2);
addDockWidget(Qt::RightDockWidgetArea,dock2);
//停靠視窗3
//dock3=new QDockWidget(tr("DockWindow3"),this);
dock3->setFeatures(QDockWidget::AllDockWidgetFeatures);
QTextEdit *te3=new QTextEdit();
te3->setText(tr("Window3,The dock widget can be closed,moved,add floated"));
dock3->setWidget(te3);
addDockWidget(Qt::RightDockWidgetArea,dock3);
}
DockWindows::~DockWindows()
{
}
  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