Qt-Advanced-Docking-System配置及使用、心得
Qt-Advanced-Docking-System
- 1. Qt-Advanced-Docking-System描述
- 2. 功能特点
- 2.1. 灵活的停靠方式
- 2.2. 嵌套停靠
- 2.3. 自定义布局保存与恢复
- 2.4. 外观和行为定制
- 3. 与Qt原生停靠系统的比较
- 4. 使用场景
- 4.1. 集成开发环境(IDE)
- 4.2. 图形设计软件
- 4.3. 数据分析和可视化工具
- 5. 下载链接
- 6. 构建
- 7. 创建`include`文件夹
- 8. 在`lib`和`include`同级目录创建`QtDock.pri`文件
- 9. 调用
- 10. 小栗子
- 11. 心得
1. Qt-Advanced-Docking-System描述
Qt - Advanced - Docking - System
是一个用于Qt框架的扩展库,它提供了高级的停靠窗口(Docking Window)功能。在传统的图形用户界面(GUI)应用程序中,停靠窗口能够让用户灵活地组织和管理界面空间,方便用户根据自己的需求对各种工具窗口、信息窗口等进行布局。
2. 功能特点
2.1. 灵活的停靠方式
支持多种停靠方式,可以将窗口停靠在主窗口的边缘(上、下、左、右),就像许多集成开发环境(IDE)中的工具窗口一样。例如,在一个代码编辑器软件中,可以将文件浏览器窗口停靠在主编辑窗口的左侧,将调试信息窗口停靠在底部。而且,这些窗口还可以进行浮动(Floating)操作,用户能够将停靠窗口拖离主窗口的边缘,使其成为一个独立的浮动窗口,方便在多个屏幕或者复杂的布局场景下使用。
2.2. 嵌套停靠
允许嵌套停靠,这意味着可以在一个已停靠的窗口内部再创建停靠区域,实现更复杂的布局。例如,在一个图形处理软件中,可以在主图像显示窗口的一侧停靠一个包含多个工具选项卡(如颜色调整、滤镜等)的窗口,而在这个工具选项卡窗口内部,又可以将不同的工具组(如亮度/对比度调整组和色彩平衡调整组)进行进一步的停靠布局。
2.3. 自定义布局保存与恢复
能够帮助用户保存自定义的窗口布局,并且在下次启动应用程序时恢复。这对于那些有复杂工作流程和特定界面布局偏好的用户非常有用。比如,一个专业的音频编辑软件用户可能花费了很多时间来调整各个音频轨道窗口、效果窗口和混音窗口的布局,通过这个功能,下次打开软件时就可以快速恢复到之前的工作布局。
2.4. 外观和行为定制
提供了丰富的选项来定制停靠窗口的外观和行为。可以设置窗口的标题栏样式,包括按钮的显示(如最小化、最大化、关闭按钮)和外观。还可以控制窗口的拖动行为、缩放行为等。例如,在一个具有简洁风格要求的软件中,可以隐藏停靠窗口标题栏上的一些不必要的按钮,或者调整窗口拖动时的敏感度。
3. 与Qt原生停靠系统的比较
Qt本身自带了基本的停靠系统,但Qt - Advanced - Docking - System
在功能上更加丰富和灵活。Qt原生停靠系统能够满足一些简单的应用场景,但在面对复杂的多窗口、嵌套式停靠以及高度定制化的需求时,可能会显得力不从心。
例如,Qt原生停靠系统在处理多个窗口之间的嵌套关系以及复杂的浮动和重新停靠操作时,可能没有Qt - Advanced - Docking - System
那样直观和方便。
4. 使用场景
4.1. 集成开发环境(IDE)
在IDE中,通常需要同时展示多个工具窗口,如代码编辑器、项目资源管理器、调试控制台等。Qt - Advanced - Docking - System可以让这些窗口以灵活的方式停靠,方便开发者根据自己的编程习惯进行布局。而且,开发者可以方便地将某个窗口浮动出来,放在另一个屏幕上进行参考,比如将文档窗口浮动出来对照代码进行编写。
4.2. 图形设计软件
对于图形设计软件,需要各种工具窗口,如颜色调色板、图层管理、图形元素库等。通过该系统,可以将这些工具窗口以合适的方式停靠在主绘图窗口周围,并且可以根据用户的操作习惯进行布局调整,如将常用的工具窗口停靠在更方便操作的位置,或者将不常用的窗口隐藏或最小化。
4.3. 数据分析和可视化工具
在这类工具中,可能有数据输入窗口、数据处理窗口、图表显示窗口等多种窗口。使用Qt - Advanced - Docking - System
可以实现这些窗口的有效布局,比如将数据输入和处理窗口停靠在一起,方便用户进行操作,同时将图表显示窗口以较大的空间进行停靠,便于观察数据可视化的结果。
5. 下载链接
链接: link
https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System
下载后,得到一个压缩包,直接解压,使用QtCreator直接打开,使用库版本>5.8的
得kit进行构建,因为里面用到的一个Q_NAMESPACE
宏,是5.8版本开始引入的。我这里是使用Qt6版本,这个库也支持Qt6版本。
6. 构建
直接对src
进行构建,构建完后,会生成lib
文件夹,里面有.a
、 .dll
。
lib
目录同级下的src
目录是生成.o
和makefile
等文件的目录,可删除。
7. 创建include
文件夹
在lib
目录创建include
文件夹,然后将Qt-Advanced-Docking-System-master
目录下的src
目录下的所有文件都拷贝到include
文件夹,然后将所有.cpp
文件删除,组成调用库的头文件目录。
8. 在lib
和include
同级目录创建QtDock.pri
文件
接下来,创建个QtDock
文件夹,将lib
目录、include
目录、QtDock.pri
放到QtDock
目录内。
在QtDock.pri
文件添加内容如下,用于配置和调用,这样在.pro
文件只需要引入QtDock.pri
就可以使用了,酷:
LIBS += -L$$PWD/lib -lqtadvanceddockingINCLUDEPATH += $$PWD/include/
DEPENDPATH += $$PWD/include/
QtDock.pri
文件内容可根据系统、模式、编译器、或者一些其他配置进行自定义编写。
以上步骤6
、步骤7
、步骤8
将QtDock配置成一个模块,便于引用。
9. 调用
创建新的Qt项目,将封装好的QtDock
目录直接拷贝到Qt项目下。
在.pro
文件中添加以下内容,就可以调用了:
include($$PWD/QtDock/QtDock.pri)
10. 小栗子
部分代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"#define VERSION 9527int MainWindow::s_nIndex = 0;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_pLabel = new QLabel();ui->statusbar->addWidget(m_pLabel);m_pMgr = new ads::CDockManager(this);setCentralWidget(m_pMgr);m_pWCentral = new ads::CDockWidget("中");m_pWLeft = new ads::CDockWidget("左");m_pWuP = new ads::CDockWidget("上");m_pWRight = new ads::CDockWidget("右");m_pWBottom = new ads::CDockWidget("下");m_pMgr->setCentralWidget(m_pWCentral);m_pWLeft->setWidget(new QLabel("左"));m_pWuP->setWidget(new QLabel("上"));m_pWRight->setWidget(new QLabel("右"));m_pWBottom->setWidget(new QLabel("下"));m_pWCentral->setWidget(new QLabel("中"));m_pMgr->addDockWidget(ads::DockWidgetArea::LeftDockWidgetArea, m_pWLeft);m_pMgr->addDockWidget(ads::DockWidgetArea::TopDockWidgetArea, m_pWuP);m_pMgr->addDockWidget(ads::DockWidgetArea::RightDockWidgetArea, m_pWRight);m_pMgr->addDockWidget(ads::DockWidgetArea::BottomDockWidgetArea, m_pWBottom);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_action_saveState_triggered()
{m_ba = m_pMgr->saveState(VERSION);m_pLabel->setText("保存布局.");
}void MainWindow::on_action_restoreState_triggered()
{bool bRestore = m_pMgr->restoreState(m_ba, VERSION);if (bRestore)m_pLabel->setText("加载布局成功.");
}void MainWindow::on_action_addUpLayout_triggered()
{s_nIndex++;ads::CDockWidget* pW = new ads::CDockWidget(QString("新添加 上 布局_%1").arg(s_nIndex));pW->setWidget(new QLabel(QString("新添加 上 布局")));m_pMgr->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, pW, m_pWuP->dockAreaWidget());
}void MainWindow::on_action_addBottomLayout_triggered()
{s_nIndex++;ads::CDockWidget* pW = new ads::CDockWidget(QString("新添加 下 布局_%1").arg(s_nIndex));pW->setWidget(new QLabel(QString("新添加 下 布局")));m_pMgr->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, pW, m_pWBottom->dockAreaWidget());
}void MainWindow::on_action_addLeftLayout_triggered()
{s_nIndex++;ads::CDockWidget* pW = new ads::CDockWidget(QString("新添加 左 布局_%1").arg(s_nIndex));pW->setWidget(new QLabel(QString("新添加 左 布局")));m_pMgr->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, pW, m_pWLeft->dockAreaWidget());
}void MainWindow::on_action_addRightLayout_triggered()
{s_nIndex++;ads::CDockWidget* pW = new ads::CDockWidget(QString("新添加 右 布局_%1").arg(s_nIndex));pW->setWidget(new QLabel(QString("新添加 右 布局")));m_pMgr->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, pW, m_pWRight->dockAreaWidget());
}
11. 心得
- CDockWidget标题名称不能重复,不然恢复布局时,重复的名称会只显示一个窗口控件;
- CDockWidget需要设置控件,不然恢复布局时,都会消失;
- 如果需要向某一Dock设置平行布局,需设置
ads::DockWidgetArea::CenterDockWidgetArea
; - 恢复布局后,之前绑定的信号和槽有的可能就失效了;
- 上下布局时,是均分的,如需设置窗口显示比例,需调用
CDockManager
类中的void setSplitterSizes(CDockAreaWidget *ContainedArea, const QList<int>& sizes)
函数; - 使用此模块时,若自由化程度较高,则出Bug的概率就会随之提升。
相关文章:

Qt-Advanced-Docking-System配置及使用、心得
Qt-Advanced-Docking-System 1. Qt-Advanced-Docking-System描述2. 功能特点2.1. 灵活的停靠方式2.2. 嵌套停靠2.3. 自定义布局保存与恢复2.4. 外观和行为定制 3. 与Qt原生停靠系统的比较4. 使用场景4.1. 集成开发环境(IDE)4.2. 图形设计软件4.3. 数据分…...

【Bolt.new + PromptCoder】三分钟还原油管主页
【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网:PromptCoder Bolt官网:https://bolt.new/ Bolt 是什么? Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示(Prompt)、运行&#x…...

影像组学+病理组学+深度学习人工智能应用
影像组学 基础学习内容: 特征提取:使用pyradiomics进行形状、纹理、小波变换等特征提取。特征筛选:应用ICC、相关系数、mRMR、Lasso等方法。建模:使用LR、SVM、RF、XGBoost、LightGBM等机器学习算法。模型评估:通过A…...

RK3568平台(基础篇)io命令支持
一.什么是io命令 “io” 命令通常用于显示 Linux 系统中的 I/O 统计信息。它提供了有关磁盘读写操作的详细信息,包括每个块设备的读写次数、读写扇区数、读写延迟等。io命令可以直接操作某个寄存器,用于查看设置某个GPIO 引脚配置了什么iomux。 二.io命令支持 RK平台要支持…...

Yolov8源码分析
1、目录介绍 主要目录ultralitics(重点) 1、assets目录 这个文件保存了YOLO历史上可以说是最经典的两张图片,供大家测试程序来使用的。 2、cfg 这个文件下面保存了我们的模型配置文件,cfg目录是项目配置的集中地,其…...

Python中的装饰器`@functools.lru_cache`:用法、来源与应用 (中英双语)
今天看到一段源码 https://github.com/google-research/google-research/blob/master/instruction_following_eval/instructions_util.py 如下,对其中使用的装饰器函数感到好奇,所以产生了这篇博客。 functools.lru_cache(maxsizeNone) def _get_sentenc…...

思维图(GoT):解锁大模型解决复杂问题的能力
今天分享的是苏黎世联邦理工学院、华沙理工大学和Cledar联合发表的一篇文章:思维图:用大语言模型解决复杂问题 论文题目:Graph of Thoughts: Solving Elaborate Problems with Large Language Models 论文链接:https://arxiv.or…...

使用winscp从windows访问Ubuntu进行文件传输
Ubuntu 系统上的准备工作 • 安装 SSH 服务器: 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装,可以使用以下命令安装: sudo apt update sudo apt install openssh-server • 启动 SSH 服务: 确保 SSH 服务正在运行&a…...

Java全栈项目:实验室预约管理系统的设计与实现
一、项目介绍 实验室预约管理系统是一个基于Java全栈技术开发的Web应用系统,旨在提供便捷的实验室预约、管理和使用体验。本系统主要面向高校师生,实现实验室资源的智能化、信息化管理。 二、技术栈 前端技术 Vue.jsElement UIAxiosVue RouterVuex …...

使用 esrally race 测试 Elasticsearch 性能及 Kibana 可视化分析指南
前言: 在对 Elasticsearch 集群进行性能测试与调优的过程中,esrally 是官方推荐的测试工具。通过 esrally race 命令,我们可以模拟各种查询与索引负载,对集群进行基准测试。然而,仅看 esrally 的终端输出并不直观&…...

OpenAI 第七日 推出了一项新功能——ChatGPT的“Projects”
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【小白51单片机专用教程】protues仿真AT89C51入门
课程特点 无需开发板0基础教学软件硬件双修辅助入门 本课程面对纯小白,因此会对各个新出现的知识点在实例基础上进行详细讲解,有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容,所有涉及…...

正则表达式——元字符匹配(单字符)
单字符匹配: ###注意事项:前面要加r:如(re.findall(r\w,字符串名)) #. :匹配任意一个字符 (.本身通过\.匹配) # [ ]: 匹配[ ]中的字符 # \d: 匹配数字 # \D: 匹配非数字 # \s: 匹配空白(空格) # \S:匹配非空白 # \w: 匹配单词字符(a…...

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)
在日常服务器操作中,很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景,不断的切换命令会话窗口会比较麻烦。基于此,编写了本文中的 fastsh 脚本用于轻度解决这种问题,提高一定的便利性。 使…...

【中间件介绍及案例分析】
中间件介绍及案例分析 一、中间件的定义 中间件是一种位于操作系统、网络和数据库之上,应用软件之下的软件。它的主要作用是为处于不同系统中的软件组件提供通用服务,使得这些软件组件能够更好地通信、协同工作,并且帮助开发人员更高效地构…...

CRMEB PHP多商户版DOCKER部署实战
#首先,制作docker 镜像# 官方有一个镜像,但是拉不来下,也不知道是没是没有维护,嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础,制作crmeb-mer的镜像,Dockerfile内容如下: # 使用官方…...

Node.js基础入门
1.Node.js 简介 Node 是一个让 JavaScript (独立)运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。 简单的说 Node.js 就是运行在服务端的…...

Hive——HQL数据定义语言
文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言(DDL)概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...

vLLM 教程上新!覆盖从入门到进阶 4 种应用方式;中文文档同步上线,0 帧起手加速大模型推理
如今,大语言模型 (LLM) 的发展正在从规模参数迭代升级拓展至应用场景的适配与创新,在这个过程中,其也暴露出一系列问题。例如,在推理环节的效率较低,处理复杂任务时耗时较长,难以满足对实时性要求较高的场景…...

Kubernetes# RBAC访问控制
目录 定义 配置对象 Role ClusterRole ServiceAccount RoleBinding ClusterRoleBinding 配置示例 定义 Kubernetes的运行是由多种类型的资源组合起来,每种资源各司其职完成整个集群的功能。那么自然也需要一套机制控制资源的访问权限,保证安全性…...

如何实现后端返回excel文件,在前端下载功能
前言 简单记录一下,excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式,返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…...

编程:一场不设防的智慧江湖
在数字的汪洋中,有一片从未设置年龄禁区的领地——编程世界。许多人会问:35岁了,还能学编程吗?答案是:不仅能学,还能学得很精彩。 时光荏苒,科技浪潮汹涌澎湃。曾经,人们以为编程是…...

电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南
电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南 在探索电脑游戏的无限乐趣时,我们时常会遇到一些不期而遇的挑战。今天,我们将聚焦于一个常见的游戏运行错误——穿越火线(或其他使用Unity引擎的游戏…...

【C++】CUDA线程在全局索引中的计算方式
文章目录 1. 一维网格一维线程块2. 二维网格二维线程块3. 三维网格三维线程块4. 不同组合形式4.1 一维网格一维线程块4.2 一维网格二维线程块4.3 一维网格三维线程块4.4 二维网格一维线程块4.5 二维网格二维线程块4.6 二维网格三维线程块4.7 三维网格一维线程块4.8 三维网格二维…...

【笔记】C语言转C++
网课链接:【C语言 转 C 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p27&share_sourcecopy_web&vd_source4abe1433c2a7ef632aeed6a3d5c0b22a 网课老师B站id:别喷我id 视频总时长:01:55:27 以下笔记是我通过此网课整理 建议先…...

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集
锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…...

半导体器件与物理篇5 1~4章课后习题
热平衡时的能带和载流子浓度 例 一硅晶掺入每立方厘米10^{16}个砷原子,求室温下(300K)的载流子浓度与费米能级。 需要用到的公式包括1.本征载流子浓度公式 2.从导带底算起的本征费米能级 2.从本征费米能级算起的费米能级 载流子输运现象 例1:计算在300K下&#x…...

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…...

机器学习之学习范式
机器学习的四种主要范式分别是:监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍: 1. 监督学习(Supervised Learning) 定义: 通过已标注的数据训练模型,以预测或分类未知数据。 目…...

PHPstudy中的数据库启动不了
法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql...