Q_INIT_RESOURCE宏
QT应用程序,无论是exe,staticlib,还是dll程序,都可以通过qrc文件来导入各种资源。
qrc会将这些资源文件转换为相应代码,参与应用程序的编译。
这样做的好处就是:简化了应用程序发布时还需要同步发布各类资源文件的烦恼,
缺点就是:应用程序会相对变大;
但是,如果我们创建的事staticlib工程,(staticlib工程的创建是通TEMPLATE=lib, LIB = staticlib的pro文件实现),那在引用lib文件的工程中,就需要试用 Q_INIT_RESOURCE宏来显示初始化资源,例如:
libstest是一个静态库,它通过libtest.qrc文件引入资源;
libtestapp是试用libtest.lib的exe程序,则在libtestapp中,需要显示通过Q_INIT_RESOURCE宏初四花libtest的资源;
如下:
Q_INIT_RESOURCE(libtest) // qrc文件名。
通过QT源代码可以发现:Q_INIT_RESOURCE宏对应生成了两个库函数:
#define Q_INIT_RESOURCE(name) \
do { extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); \
QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); } while (0)
#define Q_CLEANUP_RESOURCE(name) \
do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); \
QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (0)
而qrc在将qrc文件转换为相应代码时,会实现qInitResources_name和qCleanupResources_name函数,如下:
QT_BEGIN_NAMESPACE
extern Q_CORE_EXPORT bool qRegisterResourceData
(int, const unsigned char *, const unsigned char *, const unsigned char *);
extern Q_CORE_EXPORT bool qUnregisterResourceData
(int, const unsigned char *, const unsigned char *, const unsigned char *);
QT_END_NAMESPACE
int QT_MANGLE_NAMESPACE(qInitResources_q6800app)()
{
QT_PREPEND_NAMESPACE(qRegisterResourceData)
(0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_q6800app))
int QT_MANGLE_NAMESPACE(qCleanupResources_q6800app)()
{
QT_PREPEND_NAMESPACE(qUnregisterResourceData)
(0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_q6800app))
Q_INIT_RESOURCE宏相关推荐
- Qt开发技术:Qt的动态静态插件框架介绍和Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105481285 长期持续带来更多项目与技术分 ...
- Qt-Q_INIT_RESOURCE
原型:void Q_INIT_RESOURCE ( name ) 说明:通过初始化使用指定的基本名称.qrc文件中指定的资源.通常情况下,Qt的资源在启动时会自动加载.该Q_INIT_RESOURCE ...
- QT里的函数void Q_INIT_RESOURCE ( name )
QT里的函数voidQ_INIT_RESOURCE ( name ) Initializesthe resources specified by the .qrc file with the ...
- C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define
C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...
- OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)
1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...
- TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成
TensorRT宏碁自建云(BYOC, BuildYourOwnCloud)上集成 这个PR增加了对分区.编译和运行TensorRT BYOC目标的支持. Building 有两个新的cmake标志: ...
- 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法
1.Word选项→加载bai项→管理→转到--,转到→把勾勾都取消→确定即可. 2.工具→宏->安全性→可靠发行商,将下方的选择框中的钩清空,再将宏安全性改为最高. 3.可能是初次安装Offic ...
- C++ #define(宏定义)的使用
C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...
- 宏使用 Tricks
人为地定义一些"无意义"的宏(宏名本身有意义),以起到提升代码程序的可读性. 1. IN/OUT 指定参数用于输入还是输出: #define IN #define OUTvoid ...
最新文章
- 天线3db波束宽度_天线的主瓣波束宽度越窄天线增益越高.PPT
- 大数据处理——Hadoop解析(一)
- 创建型模式 简单工厂模式
- 126.数据链路层有哪些协议?
- 无法嵌入互操作类型 请改用适用的接口_机器视觉可用的不同电缆和连接器类型以及相关利弊分析...
- 匿名函数python_基于python内置函数与匿名函数详解
- 机器学习速成课程 | 练习 | Google Development——编程练习:创建和操控张量
- 学计算机的会excel,超级容易学电脑--Excel电子表格
- VDI环境的性能利器——固态存储
- (原创)用cmd命令制作恶搞程序
- halo博客:如何加快搜索引擎收录网站速度
- 3717 bLue的文件查找器
- python中迭代_python中的迭代什么意思
- TC Games教你如何在电脑上玩手游梦幻西游,无需模拟器
- 安装quagga(虚拟路由器)
- Shell小技巧(一百三十一)服务器tcp连接数实时统计
- Ubuntu 12 ulimit 系统最大打开文件个数 设置
- linux 剪刀石头布c语言,利用C语言编写“剪刀石头布”小游戏
- 编程小白的人工智能路之Gabor滤波提取掌纹特征并对比掌纹相似度(一)
- 提升开发效率N倍的20+命令行神器!(附 demo)
热门文章
- 苹果开放降级通道_iOS 13再见了!iOS随意降级工具即将来到~
- FTPRush.v1.1.219.Unicode-YAG
- 2022-2028全球与中国紫外线发生器市场现状及未来发展趋势
- 解锁!玩转 HelloGitHub 的新姿势
- 【云原生】五年博主教你用阿里云Serverless免费额度搭建个人应用服务, 还不赶快上车。
- c语言读硬盘温度,Windows自带API获取硬盘温度、硬盘使用时间、以及硬盘内存使用情况(包括总内存,空闲内存,已用内存)...
- 【原创】第一个iOS应用程序
- 面向对象:叶子的离开是风的追求还是树的不挽留?我若是飘离的叶子,你是否是温润我的春泥?
- zip压缩包密码破解
- 2019云栖大会丨数字冰雹诠释行业大数据可视决策