1. 程式人生 > >【QT】QT從零入門教程(六):QDockWidget停靠視窗

【QT】QT從零入門教程(六):QDockWidget停靠視窗

QDockWidget

  上節我們引出了QDockWidget的概念,這節進行講解並加以引用。

  常用函式:
  1、addDockWidget:新增停靠控制元件,用於指定或更改停靠控制元件的位置以及方向。

void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget)
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget * dockwidget, Qt::Orientation orientation)

  2、splitDockWidget:分割視窗,用於對兩個QDockWidget進行水平或垂直佈局。

void QMainWindow::splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)

  3、tabifyDockWidget:合併視窗,用於將多個QDockWidget疊加到同一區域。

void QMainWindow::tabifyDockWidget(QDockWidget * first, QDockWidget * second)

  4、setDockNestingEnabled:是否允許巢狀佈局

void QMainWindow::setDockNestingEnabled(bool enabled)

設定巢狀佈局

  在自編軟體中,博主用到了9個QDockWidget,作為軟體的基本視窗進行佈局。下面介紹建立佈局的方法。

  首先是去除中央窗體(這是重點)。QMainWindow中自帶中央窗體,如果不去除的話,可能會造成視窗間有空塊的情況,大家可以自行嘗試。去除後,所有視窗都由QDockWidget構成。

// cpp
QWidget* p = takeCentralWidget();   //刪除中央窗體
if (p)
    delete p;

setDockNestingEnabled(true
); //允許巢狀dock

建立多個視窗

  首先對setFeatures函式內的引數進行解釋。

dock->setFeatures(QDockWidget::DockWidgetMovable); // 設定可移動
dock->setFeatures(QDockWidget::DockWidgetFloatable); // 設定可浮動
dock->setFeatures(QDockWidget::DockWidgetClosable); // 設定可關閉
dock->setFeatures(QDockWidget::AllDockWidgetFeatures); // 以上三種都包含

  如果想對視窗大小進行限制呢?QDockWidget也有相應的函式。

dock ->setFixedWidth(int w);
dock ->setFixedHeight(int h);
dock ->setFixedSize(int w, int h);

dock ->setMinimumWidth(int minw);
dock ->setMinimumHeight(int minh);
dock ->setMinimumSize(int minw, int minh)

dock ->setMaximumWidth(int maxw);
dock ->setMaximumHeight (int maxh);
dock ->setMaximumSize(int maxw, int maxh)

  實現程式碼:

// 標頭檔案
QDockWidget *dock_Image;    // 影象視窗
QDockWidget* dock_Tool;// 工具箱視窗
QDockWidget* dock_Geom;// 幾何變換視窗
QDockWidget* dock_Gray;// 灰度變換視窗
QDockWidget* dock_Enhance;// 影象增強視窗
QDockWidget* dock_Morp;// 形態學處理視窗
QDockWidget* dock_Color;// 顏色模型視窗
QDockWidget* dock_Prop;// 屬性視窗
QDockWidget* dock_Output;// 輸出視窗
// cpp
// QDockWidget* dock_Image = new QDockWidget(tr("影象"), this);               // 上節中已定義,如果只想做本節內容,可取消註釋
dock_Image->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);         // 設定為可移動可浮動,但不可關閉
dock_Image->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);  // 可移動範圍:左右
dock_Image->setMinimumSize(600, 600);   // 設定最小寬高

dock_Tool = new QDockWidget(tr("工具箱"), this);           // 工具箱視窗,若想設定特徵或移動範圍,方法同上。
dock_Geom = new QDockWidget(tr("幾何變換"), this);          // 幾何變換視窗
dock_Gray = new QDockWidget(tr("灰度變換"), this);          // 灰度變換視窗
dock_Enhance = new QDockWidget(tr("影象增強"), this);       // 影象增強視窗
dock_Morp = new QDockWidget(tr("形態學處理"), this);     // 形態學處理視窗
dock_Color = new QDockWidget(tr("顏色模型"), this);         // 顏色模型視窗
dock_Prop = new QDockWidget(tr("屬性"), this);                // 屬性視窗
dock_Output = new QDockWidget(tr("輸出"), this);          // 輸出視窗

// 進行佈局
setCentralWidget(dock_Image);       // 指定為中心視窗
addDockWidget(Qt::LeftDockWidgetArea, dock_Tool);
addDockWidget(Qt::BottomDockWidgetArea, dock_Output);
addDockWidget(Qt::RightDockWidgetArea, dock_Geom);
addDockWidget(Qt::RightDockWidgetArea, dock_Gray);
addDockWidget(Qt::RightDockWidgetArea, dock_Enhance);
addDockWidget(Qt::RightDockWidgetArea, dock_Morp);
addDockWidget(Qt::RightDockWidgetArea, dock_Color);
addDockWidget(Qt::RightDockWidgetArea, dock_Prop);

// 分割視窗
splitDockWidget(dock_Tool, dock_Image, Qt::Horizontal);     // 水平
splitDockWidget(dock_Geom, dock_Output, Qt::Vertical);      // 垂直

// 合併視窗
tabifyDockWidget(dock_Geom, dock_Gray);                     
tabifyDockWidget(dock_Gray, dock_Enhance);
tabifyDockWidget(dock_Enhance, dock_Morp);
tabifyDockWidget(dock_Morp, dock_Color);
tabifyDockWidget(dock_Output, dock_Prop);

dock_Geom->raise();             // raise()函式可使指定視窗置於最前

// connect(dock_Tool, SIGNAL(visibilityChanged(bool)), this, SLOT(isDockTool())); 
// 當窗體隱藏或顯示時,其訊號為visibilityChanged(bool)函式,此處僅作簡單演示,槽函式是自定義的,其他視窗同理。

  實現效果: