Qt-Advanced-Docking-System配置及使用、心得

news2024/12/17 15:13:09

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 -lqtadvanceddocking

INCLUDEPATH += $$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 9527

int 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的概率就会随之提升。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中纯前端实现导出简单Excel表格的功能

Vue 前端Excel导出 Vue中纯前端导出简单Excel表格的方法(使用vue-json-excel插件) 前言 在许多的后台系统中少不了导出Excel表格的功能&#xff0c;在项目中纯前端使用vue-json-excel插件来实现简单Excel表格的导出功能。 使用方法 1、安装依赖 npm install vue-json-exc…

【系统分析师】-收官整理-已考过

1、考试历程 之前从未参加过软考 2023年11月系统架构师【未通过】 2024年05月系统架构师【已通过】 2024年11月系统分析师【已通过】 鉴于架构师与分析师在基础知识上比较相似&#xff0c;在看到架构考试通过后&#xff0c;就准备往系分方面。 2、考题分析 今年下半年系分考试…

暂停window11自动更新

window11 的自动更新功能&#xff0c;一方面在后台占用资源&#xff0c;容易导致电脑卡顿&#xff1b;另一方面&#xff0c;“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差&#xff0c;更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…

opengauss架构图

资料来源&#xff1a;04轻松上手openGauss之openGauss对象管理&#xff08;上&#xff09;_哔哩哔哩_bilibili 资料来源&#xff1a;04轻松上手openGauss之openGauss对象管理&#xff08;上&#xff09;_哔哩哔哩_bilibili

2024,大模型杀进“决赛圈”

Henry Chesbrough在著作《通过技术创新盈利势在必行》中&#xff0c;曾提出过一个创新的“漏斗模型”。开放式创新一开始鼓励百花齐放&#xff0c;但最终只有10%的技术能够通过这个漏斗&#xff0c;成功抵达目标市场target market&#xff0c;进入到商业化与产业化的下一个阶段…

C++重点和练习-----多态

rpg.cpp: #include <iostream>using namespace std;/*模拟一个游戏场景有一个英雄&#xff1a;初始所有属性为1atk,def,apd,hp游戏当中有以下3种武器长剑Sword&#xff1a; 装备该武器获得 1atx&#xff0c;1def短剑Blade&#xff1a; 装备该武器获得 1atk&#xff0c;1…

细说STM32F407单片机SPI基础知识

目录 一、 SPI接口和通信协议 1、 SPI硬件接口 &#xff08;1&#xff09;MOSI(Master Output Slave Input) &#xff08;2&#xff09;MISO(Master Input Slave Output) &#xff08;3&#xff09;SCK 2、SPI传输协议 &#xff08;1&#xff09;CPHA0时的数据传输时序 …

种草电商系统APP功能需求开发案例

种草电商系统‌是一种结合了社区互动和电商交易的平台&#xff0c;能看到其他小伙伴分享的各种真实购物心得、超美商品图片和超实用视频&#xff0c;让我们去发现好物。可以随心关注感兴趣的人&#xff0c;跟他们畅聊购物体验&#xff0c;点赞、评论、转发那些心动的分享。其主…

EnumMap:让Java Map更高效的技巧

前言 摘要 内容 什么是EnumMap 如何使用EnumMap EnumMap的实现原理 EnumMap的例子 测试用例 小结 前言 在Java中&#xff0c;枚举类型是一种非常有用的数据类型&#xff0c;它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用&#xff0c;例如状态码、…

测试工程师八股文05|功能测试、业务测试

一、基础概念 1、软件测试分类 1️⃣按照软件产生的阶段划分 单元测试&#xff1a;针对程序源代码进行测试【开发自测】集成测试&#xff1a;针对模块之间功能交互进行测试系统测试&#xff1a;对整个系统&#xff08;功能、非功能&#xff09;进行全面测试验收测试&#xff…

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学&#xff0c;让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域&#xff0c;与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…

Airborne使用教程

1.安装环境 前提条件&#xff1a;系统已安装Ruby 打开终端输入如下命令 gem install airborne 或者在Gemfile添加 gem airborne 然后运行bundle install 2.编写脚本 在项目中新建api_tests_spec.rb文件 以GET接口"https://www.thunderclient.com/welcome"为…

Hadoop其一,介绍本地模式,伪分布模式和全分布搭建

目录 一、Hadoop介绍 二、HDFS的本地模式 三、伪分布模式 四、Hdfs中的shell命令 五、全分布搭建 六、使用Java代码操作HDFS 1、环境准备 2、单元测试&#xff08;Junit&#xff09;​编辑 一、Hadoop介绍 Hadoop 分为三部分 &#xff1a; Common、HDFS 、Yarn、MapRe…

【Tomcat】第五站:Servlet容器

Tomcat启动后&#xff0c;获取到项目当中所有的servlet的WebServlet中的配置信息。将配置信息和类对象都写入一个map集合当中。 map就是一个key-value类型的集合。 在MyTomcat中我们获取到了类对象和注解值。 Tomcat与请求连通 1. ServletConfigMapping 1. 创建一个config包…

猫眼浏览器v4.12.1重磅升级,极速、安全、保护全方位提升

猫眼浏览器&#xff08;Catsxp&#xff09;是一款经过深度优化的网页浏览器&#xff0c;凭借其创新性的设计理念和卓越的性能表现&#xff0c;正在重新定义现代浏览器的标准。这款基于Chrome内核精心打造的浏览器不仅为用户带来了全方位的网络体验提升&#xff0c;更在保护用户…

Axure原型设计技巧与经验分享

AxureRP作为一款强大的原型设计工具&#xff0c;凭借其丰富的交互设计能力和高保真度的模拟效果&#xff0c;赢得了众多UI/UX设计师、产品经理及开发人员的青睐。本文将分享一些Axure原型设计的实用技巧与设计经验&#xff0c;帮助读者提升工作效率&#xff0c;打造更加流畅、用…

梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象表达02

目录 1、举例(二) &#xff1a;西方童话 童话『青蛙王子』 的故事 故事中的概念 2、举例(三) &#xff1a;点餐服务 『 餐馆点餐服务』 的分析步骤&#xff1a; 1、举例(二) &#xff1a;西方童话 童话『青蛙王子』 的故事 从前有一位美丽的公主&#xff0c;喜欢玩金球。…

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

OpenIPC开源FPV之Adaptive-Link天空端代码解析

OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…