KDDockWidgets 的使用
- 一、概述
- 二、原理说明
- 三、代码实例
- 1. 项目简述
- 2. 布局源码
一、概述
KDDockWidgets 的使用相对比较简单,建议直接参考 其提供的例子。
二、原理说明
在这种多窗口布局显示的使用最常用的就是这两个类, 也就是 MainWindow 和 DockWidget ;
在我的理解里面,MainWindow充当 DockWindow的活动区域,也相当于 DockWindow的父容器。
DockWindow 与 DockWindow 的实例的排布关系可以是并列显示的,也可以是结合拼在一起的 合并显示
DockWidget 窗口作为我们业务逻辑的 容器窗口,这个只是作为Dock功能的一个容器,本质上不会影响业务。
- 并列显示
并列显示就是使用者经常会使用的窗口会长时间打开来看
- 合并显示
合并显示则是有些显示窗口并不是用户认为非常的,可以放在一起让,自己切换着来看的。
在实际使用过程中,窗口可能需要关闭或者隐藏,这个框架同样给我们提供了对应的接口,即便是我们关闭了窗口,后面也是有入口调出之前关闭的窗口的。
最后一个常用的便是 用户自己排列了这些窗口的布局,希望下次再打开的时候按照之前的排列顺序给排布好,这个框架也是提供了保存布局情况的接口,非常容易使用的。也比较简单。
三、代码实例
上面是用KDDockWidgets 实现的一个类似 qt creator 的编辑器的框架
1. 项目简述
WorkBenchDock 就是左侧工作栏的 Dock 窗口,目的就是 来容纳 WorkBenchWD ,具体的业务逻辑实现其实放置于 WorkBenchWD 中的。
// 主Dock 窗口
KDDockWidgets::MainWindow *DockMainWindow;
//Dock 窗口
KDDockWidgets::DockWidget *WorkBenchDock;
KDDockWidgets::DockWidget *QuestionDock;
KDDockWidgets::DockWidget *SearchDock;
KDDockWidgets::DockWidget *EditorDock;
// Dock 窗口中实际使用的控件
WorkBenchWG *WorkBenchWD;
SearchWG * SearchWD;
QuestionWG * QuestionWD;
EditorWG * EditorWD;
2. 布局源码
- MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <kddockwidgets/MainWindow.h>
#include <kddockwidgets/DockWidget.h>
#include <QuestionWG.h>
#include <SearchWG.h>
#include <WorkBenchWG.h>
#include <EditorWG.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void InitWidget();
void InitLayout();
void InitMenu();
private:
Ui::MainWindow *ui;
// 主Dock 窗口
KDDockWidgets::MainWindow *DockMainWindow;
//Dock 窗口
KDDockWidgets::DockWidget *WorkBenchDock;
KDDockWidgets::DockWidget *QuestionDock;
KDDockWidgets::DockWidget *SearchDock;
KDDockWidgets::DockWidget *EditorDock;
// Dock 窗口中实际使用的控件
WorkBenchWG *WorkBenchWD;
SearchWG * SearchWD;
QuestionWG * QuestionWD;
EditorWG * EditorWD;
};
#endif // MAINWINDOW_H
- MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitWidget();
InitLayout();
InitMenu();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitWidget()
{
DockMainWindow = new KDDockWidgets::MainWindow("DOCKMAINWINDOW");
WorkBenchDock = new KDDockWidgets::DockWidget("WORKBENCH");
WorkBenchDock->setMaximumWidth(300);
WorkBenchDock->setMinimumWidth(120);
WorkBenchDock->setTitle(tr("项目"));
QuestionDock = new KDDockWidgets::DockWidget("QUESTIONDOCK");
QuestionDock->setTitle(tr("问题"));
QuestionDock->setMaximumWidth(600);
SearchDock = new KDDockWidgets::DockWidget("SEARCHDOCK");
SearchDock->setTitle(tr("搜索"));
EditorDock = new KDDockWidgets::DockWidget("EDITORDOCK");
EditorDock->setTitle(tr("编辑器"));
WorkBenchWD = new WorkBenchWG;
SearchWD = new SearchWG;
QuestionWD= new QuestionWG;
EditorWD = new EditorWG;
WorkBenchDock->setWidget(WorkBenchWD);
SearchDock->setWidget(SearchWD);
QuestionDock->setWidget(QuestionWD);
EditorDock->setWidget(EditorWD);
}
void MainWindow::InitLayout()
{
this->setCentralWidget(DockMainWindow);
DockMainWindow->addDockWidget(EditorDock, KDDockWidgets::Location_OnRight);
DockMainWindow->addDockWidget(SearchDock, KDDockWidgets::Location_OnBottom);
DockMainWindow->addDockWidget(WorkBenchDock, KDDockWidgets::Location_OnLeft);
SearchDock->addDockWidgetAsTab(QuestionDock);
}
void MainWindow::InitMenu()
{
ui->DisplayMenu->addAction(WorkBenchDock->toggleAction());
ui->DisplayMenu->addAction(QuestionDock->toggleAction());
ui->DisplayMenu->addAction(SearchDock->toggleAction());
ui->DisplayMenu->addAction(EditorDock->toggleAction());
//保存当前布局
QAction *SaveLayoutAction = new QAction("保存布局", ui->LayoutMenu);
connect(SaveLayoutAction, &QAction::triggered, [=]()
{
KDDockWidgets::LayoutSaver saver;
const bool result = saver.saveToFile(QStringLiteral("mylayout.json"));
});
QAction *LoadLayoutAction = new QAction("加载布局", ui->LayoutMenu);
connect(LoadLayoutAction, &QAction::triggered, [=]()
{
KDDockWidgets::RestoreOptions options = KDDockWidgets::RestoreOption_None;
options |= KDDockWidgets::RestoreOption_RelativeToMainWindow;
KDDockWidgets::LayoutSaver saver(options);
saver.restoreFromFile(QStringLiteral("mylayout.json"));
});
ui->LayoutMenu->addAction(SaveLayoutAction);
ui->LayoutMenu->addAction(LoadLayoutAction);
}
若需要全部源码,评论区给我留言即可