当前位置: 首页 > news >正文

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目录是生成.omakefile等文件的目录,可删除。
在这里插入图片描述
在这里插入图片描述

7. 创建include文件夹

lib目录创建include文件夹,然后将Qt-Advanced-Docking-System-master目录下的src目录下的所有文件都拷贝到include文件夹,然后将所有.cpp文件删除,组成调用库的头文件目录。

8. 在libinclude同级目录创建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. 心得

  1. CDockWidget标题名称不能重复,不然恢复布局时,重复的名称会只显示一个窗口控件;
  2. CDockWidget需要设置控件,不然恢复布局时,都会消失;
  3. 如果需要向某一Dock设置平行布局,需设置ads::DockWidgetArea::CenterDockWidgetArea;
  4. 恢复布局后,之前绑定的信号和槽有的可能就失效了;
  5. 上下布局时,是均分的,如需设置窗口显示比例,需调用CDockManager类中的void setSplitterSizes(CDockAreaWidget *ContainedArea, const QList<int>& sizes)函数;
  6. 使用此模块时,若自由化程度较高,则出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. 集成开发环境&#xff08;IDE&#xff09;4.2. 图形设计软件4.3. 数据分…...

【Bolt.new + PromptCoder】三分钟还原油管主页

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

影像组学+病理组学+深度学习人工智能应用

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

RK3568平台(基础篇)io命令支持

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

Yolov8源码分析

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

Python中的装饰器`@functools.lru_cache`:用法、来源与应用 (中英双语)

今天看到一段源码 https://github.com/google-research/google-research/blob/master/instruction_following_eval/instructions_util.py 如下&#xff0c;对其中使用的装饰器函数感到好奇&#xff0c;所以产生了这篇博客。 functools.lru_cache(maxsizeNone) def _get_sentenc…...

思维图(GoT):解锁大模型解决复杂问题的能力

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

使用winscp从windows访问Ubuntu进行文件传输

Ubuntu 系统上的准备工作 • 安装 SSH 服务器&#xff1a; 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo apt update sudo apt install openssh-server • 启动 SSH 服务&#xff1a; 确保 SSH 服务正在运行&a…...

Java全栈项目:实验室预约管理系统的设计与实现

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

使用 esrally race 测试 Elasticsearch 性能及 Kibana 可视化分析指南

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

OpenAI 第七日 推出了一项新功能——ChatGPT的“Projects”

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

【小白51单片机专用教程】protues仿真AT89C51入门

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

正则表达式——元字符匹配(单字符)

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

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)

在日常服务器操作中&#xff0c;很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景&#xff0c;不断的切换命令会话窗口会比较麻烦。基于此&#xff0c;编写了本文中的 fastsh 脚本用于轻度解决这种问题&#xff0c;提高一定的便利性。 使…...

【中间件介绍及案例分析】

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

CRMEB PHP多商户版DOCKER部署实战

#首先&#xff0c;制作docker 镜像# 官方有一个镜像&#xff0c;但是拉不来下&#xff0c;也不知道是没是没有维护&#xff0c;嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础&#xff0c;制作crmeb-mer的镜像&#xff0c;Dockerfile内容如下&#xff1a; # 使用官方…...

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数据定义语言&#xff08;DDL&#xff09;概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...

vLLM 教程上新!覆盖从入门到进阶 4 种应用方式;中文文档同步上线,0 帧起手加速大模型推理

如今&#xff0c;大语言模型 (LLM) 的发展正在从规模参数迭代升级拓展至应用场景的适配与创新&#xff0c;在这个过程中&#xff0c;其也暴露出一系列问题。例如&#xff0c;在推理环节的效率较低&#xff0c;处理复杂任务时耗时较长&#xff0c;难以满足对实时性要求较高的场景…...

Kubernetes# RBAC访问控制

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

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

Linux系统:进程间通信-匿名与命名管道

本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道&#xff08;Pipe&#xff09;是一种进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;机制&#xff0c;用于在不…...

【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南

文章目录 &#x1f4cc; 前言&#x1f9f0; 一、前期准备✅ 安装 Kali Linux✅ 获取支持监听模式的无线网卡 &#x1f6e0; 二、使用 Kali Linux 进行 WiFi 安全测试步骤 1&#xff1a;插入无线网卡并确认识别步骤 2&#xff1a;开启监听模式步骤 3&#xff1a;扫描附近的 WiFi…...