一、前言
在使用PS的时候,发现PS的自由度很大,可以自由调整工作面板,如下所示,在PS中组件窗口是可以自由拖拽、浮动、自由吸附的,在Qt中用QDockWidget可以实现类似的效果。

二、QDockWidget使用
2.1、常用函数
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、DockWidget设置属性
dock->setFeatures(QDockWidget::DockWidgetMovable); // 设置可移动
dock->setFeatures(QDockWidget::DockWidgetFloatable); // 设置可浮动
dock->setFeatures(QDockWidget::DockWidgetClosable); // 设置可关闭
dock->setFeatures(QDockWidget::AllDockWidgetFeatures); // 以上三种都包含
5、DockWidget窗口大小进行限制
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)
2.2、设置嵌套布局
1、去除中央窗体(重点)
QMainWindow中自带中央窗体,如果不去除的话,可能会造成窗口间有空块的情况,大家可以自行尝试。去除后,所有窗口都由QDockWidget构成。
QWidget* p = takeCentralWidget(); //删除中央窗体
if (p) {
delete p;
}
setDockNestingEnabled(true); //允许嵌套dock
2、布局(详细代码)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QDockWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
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;// 输出窗口
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QWidget* p = takeCentralWidget(); //删除中央窗体
if (p)
delete p;
setDockNestingEnabled(true); //允许嵌套dock
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()函数可使指定窗口置于最前
}
MainWindow::~MainWindow()
{
}
3、效果展示

本文介绍了如何在Qt中利用QDockWidget实现类似Photoshop的工作面板布局,包括添加、分割、合并停靠窗口,以及设置窗口大小限制和嵌套布局,以创建灵活的用户界面。





