【CMake】为可执行程序或静态库添加 Qt 资源文件,静态库不生效问题
【CMake】添加静态库中的 Qt 资源
文章目录
- 可执行程序
- 1. 创建资源文件(.qrc)
- 2. 修改 CMakeLists.txt
- 3. 使用资源文件
- 静态库
- 1. 修改 CMakeLists.txt
- 2. 使用资源
- 2.1 初始化资源文件
- 2.2 可执行程序中调用
这里介绍的不是使用 Qt 创建工程时默认的 CMakeLists.txt,是使用 Visual Studio + Qt 的方式开发的 CMakeLists.txt,开发环境 VS2019 + Qt 5.12
可执行程序
1. 创建资源文件(.qrc)
首先,创建一个Qt资源文件(例如resources.qrc),并在其中列出你想要包含的资源文件。例如:
<RCC><qresource prefix="/"><file>images/logo.png</file><file>styles/style.qss</file></qresource>
</RCC>
示例目录结构
MyQtApp/
├── CMakeLists.txt
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
├── resources.qrc
└── resources/├── images/│ └── logo.png└── styles/└── style.qss
2. 修改 CMakeLists.txt
一般为可执行程序,即 App 应用,可以使用以下方式修改 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)project(MyQtApp)
find_package(Qt5 COMPONENTS Widgets REQUIRED)# 添加资源文件
set(RESOURCE_FILES resources.qrc)
qt5_add_resources(QT_RESOURCES ${RESOURCE_FILES})# 添加源文件
set(SOURCE_FILES main.cpp mainwindow.cpp)# 添加头文件
set(HEADER_FILES mainwindow.h)# 添加可执行文件
add_executable(MyQtApp ${SOURCE_FILES} ${HEADER_FILES} ${QT_RESOURCES})# 链接Qt5库
target_link_libraries(MyQtApp Qt5::Widgets)
3. 使用资源文件
在 Qt 代码中,可以通过使用:/前缀来访问资源文件。例如:
#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QPixmap>
#include <QFile>
#include <QTextStream>int main(int argc, char *argv[])
{QApplication app(argc, argv);QMainWindow mainWindow;QLabel label(&mainWindow);// 加载图像资源QPixmap pixmap(":/images/logo.png");label.setPixmap(pixmap);// 加载样式表资源QFile file(":/styles/style.qss");if (file.open(QFile::ReadOnly | QFile::Text)) {QTextStream stream(&file);QString styleSheet = stream.readAll();app.setStyleSheet(styleSheet);}mainWindow.show();return app.exec();
}
静态库
通常在可执行文件拥有资源文件时,其他库使用 CMake 可能不生效
1. 修改 CMakeLists.txt
与可执行程序相同的方式创建 资源文件,此处不重复赘述。
# 添加资源文件
set(RESOURCE_FILES resources.qrc)
qt5_add_resources(QT_RESOURCES ${RESOURCE_FILES})set(SOURCE_FILES mylib.cpp
set(HEADER_FILES mylib.h)# 添加静态库
add_library(MyStaticLib STATIC ${SOURCE_FILES} ${HEADER_FILES} ${QT_RESOURCES})
# 链接Qt5库
target_link_libraries(MyStaticLib Qt5::Core)
目录结构示例:
MyStaticLib/
├── CMakeLists.txt
├── mylib.cpp
├── mylib.h
├── resources.qrc
└── resources/├── images/│ └── logo.png└── styles/└── style.qssMyQtApp/
├── CMakeLists.txt
└── main.cpp
2. 使用资源
使用资源文件的方式与可执行程序类似,使用 :/ 前缀来访问资源文件。可在静态库中使用资源文件,或主程序中使用资源文件。
若静态库中的资源未生效,则需要在可执行程序中手动初始化静态库中的资源文件。
2.1 初始化资源文件
在静态库源文件中定义初始化资源函数 ,使用 Q_INIT_RESOURCE 宏来初始化静态库的资源文件。
#include <QtCore/QResource>// 定义初始化资源的函数
void initMyStaticLibResources()
{Q_INIT_RESOURCE(resources);
}
2.2 可执行程序中调用
#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QPixmap>
#include <QFile>
#include <QTextStream>// 声明初始化资源的函数
extern void initMyStaticLibResources();int main(int argc, char *argv[])
{QApplication app(argc, argv);// 初始化静态库的资源文件initMyStaticLibResources();QMainWindow mainWindow;QLabel label(&mainWindow);// 加载图像资源QPixmap pixmap(":/images/logo.png");label.setPixmap(pixmap);// 加载样式表资源QFile file(":/styles/style.qss");if (file.open(QFile::ReadOnly | QFile::Text)) {QTextStream stream(&file);QString styleSheet = stream.readAll();app.setStyleSheet(styleSheet);}mainWindow.show();return app.exec();
}
相关文章:
【CMake】为可执行程序或静态库添加 Qt 资源文件,静态库不生效问题
【CMake】添加静态库中的 Qt 资源 文章目录 可执行程序1. 创建资源文件(.qrc)2. 修改 CMakeLists.txt3. 使用资源文件 静态库1. 修改 CMakeLists.txt2. 使用资源2.1 初始化资源文件2.2 可执行程序中调用 这里介绍的不是使用 Qt 创建工程时默认的 CMakeLi…...
服务器、jvm、数据库的CPU飙高怎么处理
服务器 CPU 飙高处理 排查步骤: 监控工具:使用操作系统自带的监控工具,比如 top、htop、sar、vmstat 等,查看哪些进程占用了大量的 CPU 资源。进程排查:通过 top 等工具找到消耗 CPU 最高的进程,确定是哪…...
自适应过滤法—初级
#课本P144例题 """ Python 简单的自适应过滤移动平均预测方法 """ import numpy as np import matplotlib.pyplot as plt#用于迭代的函数 def self_adaptive( seq, N, k, maxsteps ):## 初始化序列seq_ada = np.zeros( len(seq) ) # 设置预测…...
UML图有用吗?真正厉害的软件开发,有用的吗?什么角色用?
UML(Unified Modeling Language,统一建模语言)图在软件开发中是有用的,但其使用取决于项目的规模、复杂度以及开发团队的实践习惯。真正厉害的开发者并非一定要依赖UML图,但在某些情况下,UML图确实能够提升…...
基于Java+Springboot+Vue开发的酒店客房预订管理系统
项目简介 该项目是基于JavaSpringbootVue开发的酒店客房预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java…...
OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条(trackbar)的当前…...
拓扑排序在实际开发中的应用
1. 拓扑排序说明 简单解释:针对于有向无环图(DAG),给出一个可行的节点排序,使节点之间的依赖关系不冲突。 复杂解释:自行搜索相关资料。 本次应用中的解释:给出一个可行的计算顺序࿰…...
【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】
1.点进去 是一个登录系统,有录取名单和学籍信息 发现通过姓名和身份证号可以进行录取查询,推测录取查询可能得到学生对应学号和密码,但是身份证号中的出生日期部分未知,所以可以进行爆破 2.打开bp抓包 这里注意抓的是学院录取查…...
Windows 添加右键以管理员身份运行 PowerShell
在 Windows 系统中添加一个右键菜单选项,以便可以使用管理员权限打开 PowerShell,可以通过编辑注册表来实现。 打开注册表编辑器: 按 Win R 打开运行对话框。输入 regedit 并按回车,这将打开注册表编辑器。 导航到文件夹背景键&…...
数学建模算法与应用 第15章 预测方法
目录 15.1 微分方程模型 Matlab代码示例:求解简单的微分方程 15.2 灰色预测模型(GM) Matlab代码示例:灰色预测模型 15.3 自回归模型(AR) Matlab代码示例:AR模型的预测 15.4 指数平滑法 M…...
HC32F460KETA PETB JATA 工业 自动化 电机
HC32F460 系列是基于 ARM Cortex-M4 32-bit RISC CPU,最高工作频率 200MHz 的高性能 MCU。Cortex-M4 内核集成了浮点运算单元(FPU)和 DSP,实现单精度浮点算术运算,支持 所有 ARM 单精度数据处理指令和数据类型…...
linux系统,不定时kernel bug :soft lockup的问题
这个问题困扰好久,机器经常不定时卡死,只能重启 后来检查是因为没有安装nvidia显卡驱动,或者更新到最新驱动 下载地址:驱动详情 禁止nouveau就可以了...
【C语言教程】【常用类库】(十四)可移植库 - <unistd.h> 和 <sys/types.h>
14. 可移植库 - <unistd.h> 和 <sys/types.h> UNIX和类UNIX系统上提供的一组头文件,其中<unistd.h>定义了POSIX操作系统API的访问点,而<sys/types.h>定义了许多基础数据类型。这些库在多种环境中增强了C程序的可移植性。 14.1…...
Java项目实战II基于Spring Boot的周边游平台设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着人们生…...
远程控制软件哪个好用:4款主流的远程控制软件大点评,谁最给力?
战国时期,有百家争鸣,九流十家,争芳斗艳; 时至今日,科学技术突飞猛进、一日千里,各大远程控制软件更是佳丽三千、琳琅满目、各有千秋! 这时,新的问题来了:远程控制软件哪…...
基于springboot实习管理系统
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…...
(38)MATLAB分析带噪信号的频谱
文章目录 前言一、MATLAB仿真代码二、仿真结果画图总结 前言 本文给出带噪信号的时域和频域分析,指出频域分析在处理带噪信号时的优势。 首先使用MATLAB生成一段信号,并在信号上叠加高斯白噪声得到带噪信号,然后对带噪信号对其进行FFT变换&…...
多级缓存-案例导入说明
为了演示多级缓存,我们先导入一个商品管理的案例,其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到MySQL的主从功能,所以需要大家在虚拟机中,利用Docker来运行一个MySQL容器。 1.1.准备目录 为了方便后期配置MySQL,我们…...
基于Python的自然语言处理系列(31):SpaCy + Training Neural Network
1. 介绍 在自然语言处理的多个任务中,训练神经网络模型是一个至关重要的步骤,它能帮助我们实现更精准的模型预测。对于特定的任务,如命名实体识别(NER)或文本分类,使用自定义的训练数据对模型进行微调是提高模型表现的有效方式。在这篇文章中,我们将深入探讨如何从零开始…...
在 cPanel 中管理区域编辑权限
在 cPanel & WHM 60 版本中,cPanel 界面有四种不同方式编辑你的区域文件。简单 DNS 编辑器(cPanel >> 域名 >> 简单 DNS 编辑器)允许用户设置 A 记录和 CNAME 记录。高级 DNS 编辑器(cPanel >> 域名 >&g…...
AI智能体架构设计:从成本黑洞到价值引擎的解耦之道
1. 从成本黑洞到价值引擎:为什么你的AI智能体架构正在吞噬预算又到了季度技术复盘会,财务那边递过来的云账单和工程人力成本,是不是又让你倒吸一口凉气?你看着报表上那个名为“AI智能体平台”的项目,它的资源消耗曲线几…...
从USB转TTL接线到手机热点配网:ESP8266无线通信保姆级避坑指南(附软件包)
从USB转TTL接线到手机热点配网:ESP8266无线通信保姆级避坑指南 当你第一次拿起ESP8266模块时,可能会被这个小巧的Wi-Fi模块惊艳到——它只有指甲盖大小,却蕴含着强大的无线通信能力。但很快,这种惊艳就会变成困惑:为什…...
MBTI性格测试
简介 MBTI(Myers‑Briggs Type Indicator,迈尔斯‑布里格斯类型指标)是基于荣格心理类型理论发展出的性格类型工具,由凯瑟琳库克布里格斯及其女儿伊莎贝尔布里格斯迈尔斯创建。它通过四对偏好维度将个体的认知与行为倾向归纳为 16…...
原神私服新纪元:KCN-GenshinServer图形化服务端全功能解析
原神私服新纪元:KCN-GenshinServer图形化服务端全功能解析 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 你是否曾想过拥有一个完全由自己掌控的提瓦特大陆&am…...
用ESP32-C3的PWM做个RGB呼吸灯吧:从配置结构体到色彩渐变(乐鑫ESP-IDF实战)
ESP32-C3 RGB呼吸灯实战:从PWM配置到色彩渐变算法 当智能家居的灯光不再只是简单的开关控制,而是能像呼吸般自然渐变时,整个空间的氛围立刻变得生动起来。ESP32-C3凭借其出色的LED PWM控制器(LEDC)外设,为开…...
Unity中实现深度遮挡:LingBot-Depth实战接入与优化
1. 这不是“加个插件就完事”的AR效果——为什么LingBot-Depth在Unity里值得专门写一篇实战教程你肯定见过那种AR应用:虚拟椅子摆在真实地板上,但当你绕到椅子后面,它依然完整显示,完全无视身后那堵真实的墙;或者一只3…...
如何用Untrunc拯救损坏视频?2025年终极MP4修复工具完全指南
如何用Untrunc拯救损坏视频?2025年终极MP4修复工具完全指南 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 当你…...
从脚本到系统:设计一个支持插件、限流、重试与监控的 Python 异步爬虫框架
从脚本到系统:设计一个支持插件、限流、重试与监控的 Python 异步爬虫框架 很多人第一次写 Python 爬虫,都是从几十行脚本开始的:requests.get()、BeautifulSoup、for 循环、保存 CSV。它很快,也很有成就感。但真实项目往往不是“…...
PrediPrune:机器学习驱动的编译器超级优化候选剪枝策略
1. 项目概述与核心挑战在编译器优化的世界里,我们总在追求极致的性能。传统的编译器优化器,比如LLVM的Pass,依赖于一系列预定义的、经过验证的转换规则。它们很高效,但想象力也受限于这些规则。超级优化器(Superoptimi…...
从零开始,在Hermes Agent项目中接入Taotoken服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始,在Hermes Agent项目中接入Taotoken服务 基础教程类,引导使用Hermes Agent框架的开发者完成接入&a…...
