Qt扩展-KDDockWidgets 的使用
作者:小教学发布时间:2023-09-28分类:程序开发学习浏览:67
导读:KDDockWidgets的使用一、概述二、原理说明三、代码实例1.项目简述2.布局源码一、概述KDDockWidgets的使用相对比较简单,建议直...
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);
}
若需要全部源码,评论区给我留言即可
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版