Qt扩展-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_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);
}

若需要全部源码,评论区给我留言即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/143637.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Java 10-1 集合

目录 泛型和类型安全的集合 基本概念 添加一组元素 打印集合 List Iterator&#xff08;迭代器&#xff09; 本笔记参考自&#xff1a; 《On Java 中文版》 在进行程序设计时我们会发现&#xff0c;程序总是会根据某些在运行时才能知道的条件来创建新的对象。这意味着&am…

C#中实现单元测试的示例流程_MSTest测试项目

一、单元测试简介 1.1、单元测试简介 在《单元测试艺术》一书中对于单元测试的定义是&#xff1a;【一个单元测试是一段代码&#xff0c;这段代码调用一个工作单元&#xff08;指&#xff1a;调用软件中的一个方法&#xff0c;这个方法执行过程中所发生的所有行为以及最后产生…

Day05-循环高级和数组

循环高级 1.无限循环 概念&#xff1a; 又叫死循环。循环一直停不下来。 for格式&#xff1a; for(;;){System.out.println("循环执行一直在打印内容"); } 解释&#xff1a; 初始化语句可以空着不写&#xff0c;表示循环之前不定义任何的控制变量。 条件判断…

maven中relativepath标签的含义

一 relative标签的含义 1.1 作用 这个<parent>下面的<relativePath>属性&#xff1a;parent的pom文件的路径。 relativePath 的作用是为了找到父级工程的pom.xml;因为子工程需要继承父工程的pom.xml文件中的内容。然后relativePath 标签内的值使用相对路径定位…

ChatGPT 在机器学习中的应用

办公室里一个机器人坐在人类旁边&#xff0c;Artstation 上的流行趋势&#xff0c;美丽的色彩&#xff0c;4k&#xff0c;充满活力&#xff0c;蓝色和黄色&#xff0c; DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效&#xff0c;…

matplotlib绘图实现中文宋体的两种方法(亲测)

方法一&#xff1a;这种方法我没有测试。 第一步 找宋体字体 &#xff08;win11系统&#xff09; 2.matplotlib字体目录&#xff0c;如果不知道的话&#xff0c;可以通过以下代码查询&#xff1a; matplotlib.matplotlib_fname() 如果你是Anaconda3 安装的matplotlib&#x…

uni-app打包iOS ipa文件后不上架App store为用户提供下载解决过程记录

写在前面&#xff0c;itms-services协议是什么 itms-services协议是苹果提供的一种让iOS应用在用户设备上无线安装或升级的协议。 具体来说: itms-services表示iOS应用无线安装服务的URL方案,格式为:itms-services://?actiondownload-manifest&urlMANIFEST_URL其中MANIF…

Apache Beam 2.50.0发布,该版本包括改进功能和新功能

导读我们很高兴向您介绍 Beam 的新版本 2.50.0。该版本包括改进功能和新功能。请查看此版本的下载页面。 亮点 Spark 3.2.2 被用作 Spark 运行程序的默认版本&#xff08;#23804&#xff09;。Go SDK 新增默认本地运行程序&#xff0c;名为 Prism&#xff08;#24789&#xff0…

基于web的学校二手书城系统/二手书交易系统

摘 要 本文论述了学校二手书城系统的设计和实现&#xff0c;该网站从实际运用的角度出发&#xff0c;运用了计算机网站设计、数据库等相关知识&#xff0c;网络和Mysql数据库设计来实现的&#xff0c;网站主要包括用户注册、用户登录、浏览图书、搜索图书、查看图书并进行购买…

大数据Flink(八十五):Window TVF 支持多维数据分析

文章目录 Window TVF 支持多维数据分析 一、Grouping Sets 二、​​​​​​​Rollup

【数据库】存储引擎InnoDB、MyISAM、关系型数据库和非关系型数据库、如何执行一条SQL等重点知识汇总

目录 存储引擎InnoDB、MyISAM的适用场景 关系型和非关系型数据库的区别 MySQL如何执行一条SQL的 存储引擎InnoDB、MyISAM的适用场景 InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;只有在需要它不支持的特性时&#xff0c;才考虑使用其它存储引擎。实现了四个标准的隔…

Vue2+ElementUI 静态首页案例

源码 <template><div class"app-container home"><el-row type"flex" justify"space-around" class"row-bg"><el-card class"box-card cardDiv1"><el-col :span"5"><div clas…

软考-操作系统

/4操作系统的作用 进程 进程的概念 进程是程序的一次执行过程&#xff0c;没有程序就没有进程 进程可有多个线程&#xff0c;线程可共享资源 进程的两个基本属性&#xff1a; 可拥有资源的独立单位可独立调度和分配资源的基本单位 线程可共享&#xff1a; 内存地址空间代码…

自定义Unity组件——AudioManager(音频管理器)

需求描述 在游戏开发中&#xff0c;音频资源是不可或缺的&#xff0c;通常情况下音频资源随机分布&#xff0c;各个音频的操作和管理都是各自负责&#xff0c;同时对于音频的很多操作逻辑都是大同小异的&#xff0c;这就造成了许多冗余代码的堆叠&#xff0c;除此之外在获取各类…

Axure RP9 引入eCharts图表

一、 ECharts 地址&#xff1a;https://echarts.apache.org/zh/index.html 概述&#xff1a;一个基于 JavaScript 的开源可视化图表库 提供了很多图标样式案例 二、 Axure引入eCharts图表步骤 步骤一&#xff1a;打开Axure&#xff0c;添加矩形元素&#xff0c;调整矩形所…

WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境

随着数字化转型的加速&#xff0c;政府机构与企业对高效、安全的即时通讯和协作工具的需求日益增长。企业微信和钉钉作为当前市场上较为常见的通讯工具&#xff0c;虽然在一定程度上满足了企业内部协作的需求&#xff0c;但仍存在一些问题&#xff0c;如数据安全性、私有化部署…

静态路由+BFD实例

项目拓扑与项目需求 项目需求 ① 主链路为电信&#xff0c;电信链路出故障时&#xff0c;业务数据流量切换到联通链路 实验步骤 步骤1&#xff1a;设备重命名以及IP地址的配置 设备 接口编号 IP地址 AR1 G0/0/0 10.0.13.1/24 G0/0/1 10.0.14.1/24 AR2 G0/0/0 10.0…

IntelliJ IDEA快速查询maven依赖关系

1.在Maven窗口中点击Dependencies->show Dependencies 2.得到依赖关系图 此时原有快捷键Ctrlf可以查询jar包&#xff0c;如果没有查询菜单出来则设置快捷键方式为 File->Settings->Keymap->搜索栏输入find->在Main Menu下Edit下Find下Find双击算则Add keyboard…

项目任务管理上的一些总结

1. 开发任务管理现状&#xff1a; 1&#xff1a;基于禅道进行任务派发&#xff0c;缺少任务统计&#xff0c;进度上只能以“来不及”、“进度正常”、“进度延后”等模糊字眼。 2&#xff1a;“感觉”工作效率不高了&#xff0c;工作量是否饱和&#xff0c;任务投入产出偏差多…

vue3中$refs使用调整

前言&#xff1a; vue3环境 在vue2环境中&#xff0c;可以直接通过this.$refs获取模块&#xff1b;在vue3环境中&#xff0c;通用以下两种方式获取&#xff1a; 1、通过声明ref进行获取&#xff1b; import { ref} from vue; const logoForm ref(); console.log(logoForm.va…