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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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);
}
若需要全部源码,评论区给我留言即可