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

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录

  • 资源收集文件(.qrc)
  • 外部二进制资源
  • 内编译(compiled-in)资源
  • 压缩
  • 使用应用程序中的资源
  • 使用库中的资源

Qt资源系统
Qt资源系统是一种 独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等),并且您不想冒丢失文件的风险,那么这一点非常有用。

资源系统基于qmake、rcc (Qt的资源编译器)和QFile之间的紧密合作。

资源收集文件(.qrc)

与应用程序关联的资源在**.qrc文件中指定,这是一种基于xml的文件格式,它列出磁盘上的文件,并可选择地为它们分配一个资源名称**,应用程序必须使用该名称来访问该资源。

下面是一个.qrc文件例子:

<!DOCTYPE RCC><RCC version="1.0">
<qresource><file>images/copy.png</file><file>images/cut.png</file><file>images/new.png</file><file>images/open.png</file><file>images/paste.png</file><file>images/save.png</file>
</qresource>
</RCC>

.qrc文件中列出的资源文件是应用程序源代码树的一部分。指定的路径是相对于包含.qrc文件的目录的。注意,列出的资源文件必须位于与.qrc文件相同的目录中,或者位于它的一个子目录中。

可以将资源数据编译成二进制数据,从而立即在应用程序代码中访问,或者可以创建二进制资源,稍后在注册到资源系统的应用程序代码中创建二进制资源

默认情况下,应用程序中的资源可以使用与源树中相同的文件名访问,使用:/prefix,或者使用带有qrc方案的URL。
例如,文件路径:/images/cut.png 或URL qrc:///images/cut.png 可以访问程序资源树中位于image/cut.png的文件cut.png这可以使用 file 标签的 alias 属性进行更改:

<file alias="cut-img.png">images/cut.png</file>

文件就可以从应用中通过:/cut-img.png进行访问了。使用qresource 标签的 prefix 属性还可以为 qrc 文件内的所有文件指定路径前缀:

<qresource prefix="/myresources"><file alias="cut-img.png">images/cut.png</file>
</qresource>

在这种情况下,可以通过:/myresources/cut-img.png访问该文件

有些资源需要根据用户的区域设置进行更改,例如翻译文件或图标。这是通过向 qresource 标签添加一个 lang属性,并指定一个合适的区域设置字符串来完成的。例如:

<qresource><file>cut.jpg</file>
</qresource>
<qresource lang="fr"><file alias="cut.jpg">cut_fr.jpg</file>
</qresource>

外部二进制资源

要创建外部二进制资源,必须通过将-binary开关传递给rcc来创建资源数据(通常提供.rcc扩展名)。创建二进制资源后,您可以向QResource API注册该资源。

例如,在.qrc文件中指定的一组资源数据可以用以下方式编译:

rcc -binary myresource.qrc -o myresource.rcc

在应用程序中,此资源将使用以下代码进行注册:

QResource::registerResource("/path/to/myresource.rcc");

内编译(compiled-in)资源

要将资源编译成二进制文件,必须在应用程序的.pro文件中提到.qrc文件,以便qmake知道它。例如

RESOURCES     = application.qrc

qmake将生成make规则来生成一个名为qrc_application.cpp的文件,该文件链接到应用程序中。这个文件包含图像和其他资源的所有数据,作为压缩二进制数据的静态c++数组。每当.qrc文件或它所引用的文件之一发生变化时,都会自动重新生成qrc_application.cpp文件。如果不使用.pro文件,则可以手动调用rcc或向构建系统添加构建规则。
内编译资源
目前(Qt5.12),Qt总是将数据直接存储在可执行文件中,即使在Windows、macOS和iOS上也是如此,这些操作系统提供了对资源的本地支持。这可能会在未来的Qt版本中改变。

压缩

资源默认被压缩(zip格式)。压缩是可关闭的。如果资源已经包含压缩格式,例如.png文件,那么这可能很有用。可以通过提供-no-compress命令行参数来实现这一点。

rcc -no-compress myresources.qrc

RCC还为您提供了对压缩的一些控制。您可以指定压缩文件时要考虑的压缩级别和阈值级别,例如:

rcc -compress 2 -threshold 3 myresources.qrc

使用应用程序中的资源

在应用程序中,大多数地方都可以使用资源路径,而不是普通的文件系统路径。特别是,你可以传递一个资源路径而不是文件名给QIcon, QImage,或QPixmap构造函数:

  cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);

在内存中,资源由资源对象树表示。该树在启动时自动构建,并由QFile用于解析到资源的路径。您可以使用用:/初始化的QDir从根目录开始在资源树中导航

Qt的资源支持搜索路径列表的概念。如果使用:而不是:/作为前缀引用资源,则将使用搜索路径列表查找该资源。搜索路径列表在启动时为空;调用QDir::addSearchPath()为其添加路径。

使用库中的资源

如果库中有资源,则需要使用.qrc文件的基本名称调用Q_INIT_RESOURCE()来强制初始化资源。例如:

MyClass::MyClass() : BaseClass()
{Q_INIT_RESOURCE(resources);QFile file(":/myfile.dat");...
}

这确保了在静态链接的情况下,资源被链接到最终的应用程序二进制文件中。您应该将初始化代码放在库中使用资源的位置附近,以便库的客户端只有在使用依赖于这些资源的库的特性时才会链接这些资源。

注意:由于rcc生成的资源初始化器是在全局命名空间中声明的,所以对Q_INIT_RESOURCE()的调用也需要在任何命名空间之外进行。

如果库包含的资源不在内部使用,而是公开给库的客户端,则需要在应用程序代码中进行初始化。例如:

int main(int argc, char *argv[])
{QApplication app(argc, argv);Q_INIT_RESOURCE(graphlib);QFile file(":/graph.png");...return app.exec();
}

与前面一样,在静态链接的情况下,这确保了资源被链接到最终的应用程序二进制文件中,但在动态链接(如插件)的情况下,也会触发库的加载。

如果您必须显式地卸载一组资源(因为正在卸载一个插件或资源不再有效) ,您可以通过使用与上面相同的基名称调用 Q _ CLEANUP _ RESOURCE ()来强制删除您的资源。

注意:当资源作为应用程序的一部分构建时,不需要使用Q_INIT_RESOURCE()和Q_CLEANUP_RESOURCE()。

相关文章:

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…...

同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案

功能概述 基于微信小程序开发的一款软件&#xff0c;支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻&#xff0c;对接广告功能等。 活动发布&#xff1a;用户可以在平台上发布各种类型的活动&#xff0c;如户外徒步、音乐会观赏、…...

Unable to locate the .NET SDK

问题描述&#xff1a; vs2019 加载项目时&#xff0c;提示如下&#xff1a; Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用&#xff1a; dotnet --list-sdks 命…...

C++STL初阶(1):string的使用及初阶原理

此文作为学习stl的笔记&#xff0c;许多普及、概念性的知识点将不再罗列&#xff08;如stl的发展、背景等&#xff09; 便于读者作为复习等方法了解。 0.STL简介&#xff08;笔记向&#xff09; STL不是祖师爷本贾尼实现的&#xff0c;是在惠普实验室中实现的。其作为一个数据结…...

Day41-Java基础之反射和动态代理

1. 反射 1.1 反射的概述&#xff1a; 专业的解释&#xff08;了解一下&#xff09;&#xff1a; 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff…...

Tomcat的实现

在一台电脑上启动tomcat&#xff0c;tomcat是server&#xff0c;即服务器。服务器只会被实例化一次&#xff0c;tomcat这只猫就是服务器。服务器下包含多个子节点服务&#xff0c;即service&#xff0c;顾名思义就是对外提供服务。服务器通常只有一个服务&#xff0c;默认是卡特…...

RK3576 Camera:资源介绍

RK3576是RK今年上市的中高端旗舰芯片&#xff0c;定位弱于RK3588。这篇文章主要分享一下RK3576这颗主控芯片的camera资源。 &#xff08;1&#xff09;RK3576 camera资源 ①RK3576 camera硬件框图 RK3576的camera硬件框图如图所示&#xff0c;拥有一路4lane的DCPHY&#xff…...

Symfony DomCrawler库在反爬虫应对中的应用

在当今信息爆炸的时代&#xff0c;互联网上的数据量巨大&#xff0c;但这也带来了一些问题&#xff0c;比如恶意爬虫可能会对网站造成严重的影响&#xff0c;导致资源浪费和服务不稳定。为了解决这个问题&#xff0c;许多网站采取了反爬虫策略。Symfony DomCrawler库是一个强大…...

1Panel应用推荐:Uptime Kuma

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…...

传输文件协议FTP与LFTP

目录 一.简介 二. FTP基础 主动模式&#xff08;Active Mode&#xff09;&#xff1a; 被动模式&#xff08;Passive Mode&#xff09;&#xff1a; 三. Vsftp 服务器简介 四. Vsftpd配置 1. 安装vsftpd&#xff08;ftp服务端&#xff09; 2.编辑配置文件 &#xff08;…...

expdp和impdp 实战

1 查询需要导出数据的用户 select username,default_tablespace from dba_users where username like %USERNAME%; 2 查看原来表空间大小 set linesize 9999 pagesize 9999 SELECT total.tablespace_name, Round(total.MB, 2) AS Total_MB, Round(t…...

知了汇智引领未来:全新AIGC系列课程,打造数字时代人才新标杆

在全球AIGC&#xff08;生成式人工智能&#xff09;技术加速发展的背景下&#xff0c;一系列权威报道揭示了该领域内市场潜力、行业应用、教育研究、政府监管以及具体应用场景的蓬勃进展。据腾讯网4月19日报道&#xff0c;中国AIGC应用市场规模预计于2024年达到200亿人民币&…...

软件项目验收第三方测试报告如何获取

软件项目验收第三方测试报告是确保软件质量、安全性和稳定性的重要环节。对于企业和开发者来说&#xff0c;获取一份全面、专业的第三方测试报告&#xff0c;对于提升软件产品的竞争力和用户满意度至关重要。本文将介绍如何获取软件项目验收第三方测试报告&#xff0c;以及相关…...

linux下脚本监控mysql主从同步异常时发邮件通知

在MySQL中&#xff0c;同步异常监控通常涉及监控复制的状态。可以通过查询SHOW SLAVE STATUS命令来获取复制的状态信息&#xff0c;并对其进行监控。以下是一个简单的SQL脚本&#xff0c;用于监控MySQL复制状态并输出异常信息&#xff1a; 查mysql slave状态 SHOW SLAVE STAT…...

【MySQL】分组排序取每组第一条数据

需求&#xff1a;MySQL根据某一个字段分组&#xff0c;然后组内排序&#xff0c;最后每组取排序后的第一条数据。 准备表&#xff1a; CREATE TABLE t_student_score (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,stu_name varchar(32) NOT NULL COMMENT 学生姓名,course…...

滚珠螺杆在精密机械设备中如何维持精度要求?

滚珠螺杆在精密设备领域中的运用非常之广泛&#xff0c;具有精度高、效率高的特点。为了确保滚珠螺杆在生产设备中能够发挥最佳性能&#xff0c;我们必须从多个维度进行深入考量&#xff0c;并采取针对性的措施&#xff0c;以确保其稳定、精准地服务于现代化生产的每一个环节。…...

现代 c++ 三:右值引用与移动语义

c11 为了提高效率&#xff0c;引入了右值引用及移动语义&#xff0c;这个概念不太好理解&#xff0c;需要仔细研究一下&#xff0c;下文会一并讲讲左值、右值、左值引用、右值引用、const 引用、移动构造、移动赋值运行符 … 这些概念。 左值和右值 左值和右值是表达式的属性。…...

Java学习【类与对象—封装】

Java学习【类与对象—封装】 封装的概念封装的实现包的概念import 导包导包中*的介绍import static 导入包中的静态方法和字段 static关键字的使用static 修饰成员变量static修饰方法静态成员变量的初始化 代码块静态代码块非静态代码块/实例化代码块/构造代码块加载顺序 封装的…...

Co-Driver:基于 VLM 的自动驾驶助手,具有类人行为并能理解复杂的道路场景

24年5月来自俄罗斯莫斯科研究机构的论文“Co-driver: VLM-based Autonomous Driving Assistant with Human-like Behavior and Understanding for Complex Road Scenes”。 关于基于大语言模型的自动驾驶解决方案的最新研究&#xff0c;显示了规划和控制领域的前景。 然而&…...

硅胶可以镭射吗?

在科技发展的今天&#xff0c;我们经常会遇到各种各样的材料&#xff0c;其中就有一种叫做硅胶的材料。那么&#xff0c;硅胶可以镭射吗&#xff1f;答案是肯定的&#xff0c;硅胶不仅可以镭射&#xff0c;而且在某些应用中&#xff0c;它的镭射特性还非常突出。 首先&#xff…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...