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

Qt cmake 资源文件的加载

Qt cmake 资源文件的加载

  • 概述
  • qt_add_resources
  • qt5_add_resources
  • qt6_add_resources
  • 是否需要加载qrc文件
    • 需要加载qrc的情况
    • 不需要加载qrc的情况
  • C++ 代码加载示例
    • 加载PNG
    • 加载CSS文件
    • 加载qrc文件
  • Qt6相对于Qt5的一些变化
    • Qt6和Qt5在加载资源文件方面的区别主要集中在两个方面:资源文件格式和资源加载方式。
    • Qt 6 和 Qt 5 的资源系统在 API 和功能上存在一些区别


概述

Qt是一个跨平台的C++应用程序开发框架,提供了丰富的功能和工具来帮助开发者快速开发跨平台应用程序。Qt提供了一种方便的方式来管理和加载应用程序的资源,例如图片、音频、样式表等。在本文中,我们将介绍如何使用Qt6来加载资源文件,包括CMake中加载png文件、css文件和qrc文件,我们还将介绍这些方法和Qt5的不同。


qt_add_resources

qt_add_resources 命令是在 Qt 5 中引入的命令,而 qt5_add_resources 是为了向后兼容而添加的命令。两个命令的作用是相同的,都可以用于将资源文件添加到 Qt 5 应用程序中。
从 Qt 6 开始,qt_add_resources 命令也支持 Qt 6,因此您可以在 Qt 6 中使用 qt_add_resources 命令来嵌入资源文件。


qt5_add_resources

  • 命令
qt5_add_resources(<VAR> file1.qrc [file2.qrc ...][OPTIONS ...])
  • 描述

使用Resource Compiler(rcc)从Qt资源文件创建源代码。生成的源文件的路径已添加到中
注意:这是一个低级宏。请参阅CMake AUTORCC文档,以更方便的方式使用来处理Qt资源文件rcc。要嵌入更大的资源,请参见qt5_add_big_resources。

  • 示例
 set(SOURCES main.cpp) qt5_add_resources(SOURCES example.qrc)add_executable(myapp ${SOURCES}) 

qt6_add_resources

  • 命令
qt6_add_resources(<TARGET> <RESOURCE_NAME>[PREFIX <PATH>][LANG <LANGUAGE>][BASE <PATH>][OUTPUT_TARGETS <VARIABLE_NAME>][FILES ...] [OPTIONS ...])
  • 描述

添加资源时,可以将变量名或目标作为命令的第一个参数进行传递。
当传递变量名作为第一个参数时,qt_add_resources使用资源编译器(RCC)从Qt资源文件创建源代码。生成的源文件的路径将添加到
当将目标作为第一个参数传递时,该函数将创建一个名为resource_name的资源,其中包含指定的文件。资源会自动链接到目标。
要嵌入更大的资源,请参见qt_add_Big_Resources。

  • 示例
qt6_add_resources(RESOURCE_FILESimages.qrcfonts.qrcstyles.qrcOPTIONS-binary # 将资源文件打包成二进制数据-compress # 压缩资源文件-no-compress # 不压缩资源文件-prefix /myapp/resources # 指定资源文件的前缀路径-root /path/to/resources # 指定资源文件的根目录路径-verbose # 显示详细的打包过程信息 )add_executable(myapp main.cpp ${RESOURCE_FILES})

是否需要加载qrc文件

需要加载qrc的情况

  • 如果编译时没有包含qrc文件且使用的是相对路径(例如“:/style.css”)来加载qss文件,则需要在应用程序中加载.qrc文件才能访问qss文件。

不需要加载qrc的情况

  • 如果使用的是绝对路径来加载qss文件(例如“/path/to/my/qss/file.qss”),则无需加载.qrc文件即可访问qss文件。这是因为绝对路径表示文件系统中的文件路径,而不是qrc文件中的资源路径。
  • 如果CMake项目已经包含了.qrc文件并且正确地配置了Qt Resource System,那么就不需要在应用程序中显式加载.qrc文件或资源。Qt会自动加载并处理资源,可以像使用任何其他资源一样使用它们,例如使用“:/”语法访问qrc中的资源。

C++ 代码加载示例

  • 加载PNG

//注意,在加载PNG文件时,我们使用了一个冒号后跟一个斜杠的前缀(“:/”),这是Qt的资源文件前缀。
//在使用Qt Creator创建Qt项目时,Qt Creator将为您创建一个.qrc文件,其中包含了所有要在应用程序中使用的资源。我们将在后面的部分中更详细地介绍如何使用.qrc文件。
#include <QApplication>
#include <QPixmap>
#include <QLabel> int main(int argc, char *argv[]) 
{QApplication app(argc, argv);QPixmap pixmap(":/images/image.png");QLabel label;label.setPixmap(pixmap);label.show();return app.exec();
}

  • 加载CSS文件

#include <QApplication>
#include <QFile>
#include <QTextStream>int main(int argc, char *argv[])
{QApplication app(argc, argv);QFile file(":/style/style.css");if (file.open(QIODevice::ReadOnly | QIODevice::Text)){QTextStream stream(&file);app.setStyleSheet(stream.readAll());file.close();}return app.exec();
}

  • 加载qrc文件

#include <QApplication>
#include <QLabel>
#include <QResource>int main(int argc, char *argv[]){QApplication app(argc, argv);//QResource类的使用方式类似于在文件系统中访问文件。// 加载.qrc文件QResource::registerResource("myresources.qrc");// 访问.qrc文件中的资源QPixmap pixmap(":/images/myimage.png");QLabel label;label.setPixmap(pixmap);label.show();//在应用程序退出之前,应使用QResource::unregisterResource()函数注销已加载的.qrc文件QResource::unregisterResource("myresources.qrc");return app.exec();}

Qt6相对于Qt5的一些变化

Qt6和Qt5在加载资源文件方面的区别主要集中在两个方面:资源文件格式和资源加载方式。

  • 资源文件格式:

Qt5中使用的是.qrc格式的资源文件,而Qt6中引入了一种新的.qrcs格式。.qrcs格式与.qrc格式的主要区别在于.qrcs格式可以包含一个或多个文件的元数据,而不是在.qrc文件中为每个文件定义单独的资源标识符。这使得.qrcs格式更容易使用,并且在包含大量文件的资源文件中,可以减少文件大小。

  • 资源加载方式:

在Qt5中,资源文件是在编译时通过rcc工具处理的,然后生成一个C++文件,该文件包含所有资源的二进制数据和访问接口。在运行时,应用程序可以通过调用QResource类的静态函数访问这些资源。
在Qt6中,资源文件加载方式有所改变。Qt6中的资源加载器使用了一种新的资源索引格式(RIFF),并且在运行时动态加载资源。这种方式可以减少应用程序的启动时间,并且可以支持更灵活的资源加载。

  • 优缺点对比:

Qt6的资源文件加载方式具有更好的动态加载能力,可以在需要时按需加载,减少了应用程序的启动时间,同时还可以支持更灵活的资源加载。此外,.qrcs格式也比.qrc格式更易于使用。
然而,这种新的加载方式需要Qt6运行时支持,而Qt5的.rcc加载方式是静态的,不需要额外的库或运行时支持。此外,Qt6中引入的新的.qrcs格式也需要新的rcc工具进行处理,而这种工具在某些环境中可能不可用或需要额外的安装。


Qt 6 和 Qt 5 的资源系统在 API 和功能上存在一些区别

  • 文件名后缀

在 Qt 5 中,资源文件通常使用 .qrc 后缀。而在 Qt 6 中,建议使用 .qtresource 后缀来代替。这样可以更清晰地表示文件的作用,避免与其他文件混淆。
优点:更明确的文件命名,避免了不必要的混淆和错误。

  • 模块名

在 Qt 5 中,资源文件的命名约定为 :/<module>/<path>/<file>。而在 Qt 6 中,这个约定被取消了。现在你可以使用任何合法的字符串作为模块名。
优点:更灵活的模块命名规则,可以更好地适应各种应用场景。

  • 文件格式

在 Qt 6 中,资源文件格式有了一些变化。现在,Qt 使用一种名为 Resource Compiler 的工具来处理资源文件。这种工具可以将资源文件编译为一种名为 .rcc 的格式,而不是像以前那样打包到可执行文件中。
优点:更快的启动时间,更好的资源管理,更加模块化。

  • 资源文件管理

在 Qt 6 中,资源文件的管理方式也发生了一些变化。现在,你可以使用一种名为 Resource Manager 的工具来管理资源文件,而不是像以前那样使用 qmake 来处理。优点:更加灵活和可扩展的资源管理方式,可以更好地适应各种应用场景。

相关文章:

Qt cmake 资源文件的加载

Qt cmake 资源文件的加载概述qt_add_resourcesqt5_add_resourcesqt6_add_resources是否需要加载qrc文件需要加载qrc的情况不需要加载qrc的情况C 代码加载示例加载PNG加载CSS文件加载qrc文件Qt6相对于Qt5的一些变化Qt6和Qt5在加载资源文件方面的区别主要集中在两个方面&#xff…...

【链表OJ题(九)】环形链表延伸问题以及相关OJ题

环形链表OJ题 1. 环形链表 链接&#xff1a;141. 环形链表 描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&…...

【C++初阶】四、类和对象(下)

文章目录一、再谈构造函数构造函数体赋值初始化列表explicit关键字二、Static成员引入- 计算类中创建了多少个类对象概念特性静态成员函数的访问三、友元友元函数友元类四、内部类五、匿名对象六、拷贝对象时的一些编译器优化一、再谈构造函数 构造函数体赋值 在创建对象时&a…...

IDEA maven没有Import Maven projects automatically解决办法

去年装了个 IDEA2022版本 配置maven时我才发现是个大坑 他没有import Maven projects automatically配置项 当时看到我人都麻了 然后项目呢 用了依赖 这东西还不会自动下依赖 整的我那是相当难受 还在最后还是找到了解决办法 我们在配置文件上点击右键 然后鼠标选择如下图选项…...

Java实习生------MySQL10道面试题打卡

今日语录&#xff1a;“没有执行力&#xff0c;就没有竞争力 ”&#x1f339; 参考资料&#xff1a;图解MySQL、MySQL面试题 1、事务有哪些特性&#xff1f; 原子性&#xff1a; 一个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会出现…...

帆软报表设计器 数据集之数据库查询

当点击数据库查询时,调用TableDataTreePane的 public void actionPerformed(ActionEvent var1) {TableDataTreePane.this.dgEdit(this.getTableDataInstance().creatTableDataPane(), TableDataTreePane.this.createDsName(this.getNamePrefix()), false);} 然后调用TableDat…...

CSDN 第三十七期竞赛题解

很少有时间来玩玩题目&#xff0c;上一次因为环境极为嘈杂的原因在时间上没有进入前十&#xff0c;挺遗憾的。 在 CSDN 参加的第一次没出锅的比赛。 大概只有最后一题值得好好讲讲。 T1&#xff1a;幼稚班作业 幼稚园终于又有新的作业了。 老师安排同学用发给同学的4根木棒拼接…...

Vue实战【常用的Vue小魔法】

目录&#x1f31f;前言&#x1f31f;能让你首次加载更快的路由懒加载&#xff0c;怎么能忘&#xff1f;&#x1f31f;你是否还记得有一个叫Object.freeze的方法&#xff1f;&#x1f31f;异步组件那么强&#xff0c;你是不是没用过&#xff1f;&#x1f31f;你是不是还在comput…...

用C跑爬虫

爬虫自指定的URL地址开始下载网络资源&#xff0c;直到该地址和所有子地址的指定资源都下载完毕为止。 下面开始逐步分析爬虫的实现。 待下载集合与已下载集合 为了保存需要下载的URL&#xff0c;同时防止重复下载&#xff0c;我们需要分别用了两个集合来存放将要下载的URL和…...

【C语言】你真的了解结构体吗

引言✨我们知道C语言中存在着整形(int、short...)&#xff0c;字符型(char)&#xff0c;浮点型(float、double)等等内置类型&#xff0c;但是有时候&#xff0c;这些内置类型并不能解决我们的需求&#xff0c;因为我们无法用这些单一的内置类型来描述一些复杂的对象&#xff0c…...

血氧仪是如何得出血氧饱和度值的?

目录 一、血氧饱和度概念 二、血氧饱和度监测意义 三、血氧饱和度的监测方式 四、容积脉搏波计算血氧饱和度原理 五、容积脉搏波波形的测量电路方案 1&#xff09;光源和光电探测器的集成测量模块&#xff1a;SFH7050—反射式 2&#xff09;模拟前端 六、市面上血氧仪类型…...

Java全栈知识(3)接口和抽象类

1、抽象类 抽象类就是由abstract修饰的类,其中没有只声明没有实现的方法就是抽象方法&#xff0c;抽象类中可以有0个或者多个抽象方法。 1.1、抽象类的语法 抽象类不能被final修饰 因为抽象类是一种类似于工程中未完成的中间件。需要有子类进行继承完善其功能&#xff0c;所…...

JavaScript == === Object.is()

文章目录JavaScript & & Object.is() 相等运算符 全等运算符Object.is() 值比较JavaScript & & Object.is() 相等运算符 相等运算符&#xff0c;会先进行类型转换&#xff0c;将2个操作数转为相同的类型&#xff0c;再比较2个值。 console.log("10&…...

GPT4论文翻译 by GPT4 and Human

GPT-4技术报告解读 文章目录GPT-4技术报告解读前言&#xff1a;摘要1 引言2 技术报告的范围和局限性3 可预测的扩展性3.1 损失预测3.2 人类评估能力的扩展4 能力评估4.1 视觉输入 !!!5 限制6 风险与缓解&#xff1a;7 结论前言&#xff1a; 这篇报告内容太多了&#xff01;&am…...

inode和软硬链接

文章目录&#xff1a;一、理解文件系统1.1 什么是inode1.2 磁盘了解1.2.1磁盘的硬件结构1.2.2 磁盘的分区1.2.3 EXT2文件系统二、软硬链接2.1 软链接2.2 硬链接一、理解文件系统 1.1 什么是inode inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一的 …...

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏&#xff0c;因为它声明了一个驱动的入口函数。 除了module_init宏&#xff0c;你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数&#xff0c;而是看到了许多诸如以下的声明&#xff1a; static int __init qco…...

硬件速攻-AT24CXX存储器

AT24C02是什么&#xff1f; AT24CXX是存储芯片&#xff0c;驱动方式为IIC协议 实物图&#xff1f; 引脚介绍&#xff1f; A0 地址设置角 可连接高电平或低电平 A1 地址设置角 可连接高电平或低电平 A2 地址设置角 可连接高电平或低电平 1010是设备前四位固定地址 &#xf…...

C# tuple元组详解

概念 本质就是个数据结构&#xff0c;它是将多个数据元素分组成一个轻型数据结构。 如何声明元组变量&#xff08;针对.net framework 4.7 和 .net core 2.0) 不带字段名称元组 ## t1就是个变量 它的类型是元组类型 ## 左侧括号定义的是参数列表 等于号右侧就是个t1赋值 #…...

1、Linux初级——linux命令

下载镜像&#xff1a;http://cn.ubuntu.com/dowload 一、基本命令 1、alias&#xff08;给命令取别名&#xff09; 例如&#xff1a;alias clls -la&#xff08;只是临时的&#xff09; 2、配置文件$ vim ~/.bashrc $ vim ~/.bashrc // 使用vim打开配置文件 (1)在配置文件…...

ChatGPT助力校招----面试问题分享(四)

1 ChatGPT每日一题&#xff1a;电阻如何选型 问题&#xff1a;电阻如何选型 ChatGPT&#xff1a;电阻的选型通常需要考虑以下几个方面&#xff1a; 额定功率&#xff1a;电阻的额定功率是指电阻能够承受的最大功率。在选型时&#xff0c;需要根据电路中所需要的功率确定所选…...

Vue3 + FFmpeg.wasm 实战:5分钟搞定浏览器端视频格式转换(附完整代码)

Vue3 FFmpeg.wasm&#xff1a;浏览器端视频处理的革命性方案 当现代Web应用越来越依赖多媒体处理能力时&#xff0c;传统依赖后端转码的方案暴露出明显短板&#xff1a;上传耗时、服务器压力大、隐私数据外流风险。而FFmpeg.wasm的出现彻底改变了这一局面——这个基于WebAssem…...

Phi-3-mini-4k-instruct-gguf多场景落地:跨境电商多语言商品描述批量生成

Phi-3-mini-4k-instruct-gguf多场景落地&#xff1a;跨境电商多语言商品描述批量生成 1. 跨境电商的痛点与解决方案 跨境电商卖家每天面临的最大挑战之一&#xff0c;就是为同一款商品准备不同语言版本的描述。传统做法要么需要雇佣多语种文案人员&#xff0c;要么使用机械的…...

Ostrakon-VL终端入门指南:如何导出结构化JSON结果用于BI工具接入

Ostrakon-VL终端入门指南&#xff1a;如何导出结构化JSON结果用于BI工具接入 1. 认识Ostrakon-VL终端 Ostrakon-VL终端是一款专为零售与餐饮行业设计的智能图像识别工具&#xff0c;它将复杂的AI技术包装成一个充满游戏感的像素风格界面。这个终端基于Ostrakon-VL-8B多模态大…...

第4章,[标签 Win32] :SysMets3 程序讲解01

专栏导航 上一篇&#xff1a;第4章&#xff0c;[标签 Win32] &#xff1a;SysMets3 程序代码 回到目录 下一篇&#xff1a;第4章&#xff0c;[标签 Win32] &#xff1a;SysMets3 程序讲解02&#xff0c;iVertPos 本节前言 对于本节所讲解的知识&#xff0c;有可能&#xf…...

树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)

树莓派Pico硬件重置失效&#xff1f;试试这个C语言强制重置方案&#xff08;附完整代码&#xff09; 当你在开发树莓派Pico项目时&#xff0c;可能会遇到这样的情况&#xff1a;硬件重置按钮突然失效&#xff0c;外围设备&#xff08;比如LED&#xff09;无法正常复位。传统的B…...

新手零基础入门:用快马一键生成交互式python学习jupyter notebook

作为一个刚开始学Python的小白&#xff0c;最近发现用Jupyter Notebook来练习代码特别方便。特别是列表和字典这些基础数据结构&#xff0c;通过交互式单元格可以边学边改&#xff0c;效果比单纯看教程好多了。今天就用InsCode(快马)平台来演示如何快速生成一个适合新手的交互式…...

GPIO输出模式详解:推挽与开漏对比与应用

1. GPIO输出模式基础概念在嵌入式系统开发中&#xff0c;GPIO(General Purpose Input/Output)是最基础也是最常用的外设之一。作为硬件工程师&#xff0c;深入理解GPIO的不同工作模式对于电路设计和程序开发都至关重要。今天我们就来详细剖析GPIO的两种主要输出模式&#xff1a…...

创维E900V22D_S905L3S(B)芯片-安卓9.0-免拆线刷固件包及短接神器使用指南

1. 创维E900V22D刷机前的准备工作 拿到创维E900V22D机顶盒的第一件事&#xff0c;就是确认它的硬件配置。这个型号采用的是晶晨S905L3S(B)芯片方案&#xff0c;运行的是安卓9.0系统。我遇到过不少朋友因为没看清芯片型号就开刷&#xff0c;结果把盒子刷成砖的案例。所以一定要先…...

NOR FLASH和NAND FLASH的对比

一、擦写寿命与数据可靠性 FLASH芯片的擦写次数一般来说都是有限的&#xff0c;目前主流产品的擦写寿命普遍在10万次左右。当FLASH芯片接近使用寿命终点时&#xff0c;写操作可能会出现失败。不过&#xff0c;需要注意NAND FLASH采用整块擦写机制&#xff0c;一旦块内出现一位数…...

微信小程序授权登录与权限管理的实战指南

1. 微信小程序授权登录的核心原理 微信小程序的授权登录体系是整个用户系统的基石。我第一次接触这套机制时&#xff0c;被它的简洁设计惊艳到了——只需要几个简单的API调用&#xff0c;就能建立起完整的用户身份体系。这套机制的核心在于openid&#xff0c;它是微信为每个用户…...