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

【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();
}
http://www.lryc.cn/news/461255.html

相关文章:

  • 服务器、jvm、数据库的CPU飙高怎么处理
  • 自适应过滤法—初级
  • UML图有用吗?真正厉害的软件开发,有用的吗?什么角色用?
  • 基于Java+Springboot+Vue开发的酒店客房预订管理系统
  • OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用
  • 拓扑排序在实际开发中的应用
  • 【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】
  • Windows 添加右键以管理员身份运行 PowerShell
  • 数学建模算法与应用 第15章 预测方法
  • HC32F460KETA PETB JATA 工业 自动化 电机
  • linux系统,不定时kernel bug :soft lockup的问题
  • 【C语言教程】【常用类库】(十四)可移植库 - <unistd.h> 和 <sys/types.h>
  • Java项目实战II基于Spring Boot的周边游平台设计与实现(源码+数据库+文档)
  • 远程控制软件哪个好用:4款主流的远程控制软件大点评,谁最给力?
  • 基于springboot实习管理系统
  • (38)MATLAB分析带噪信号的频谱
  • 多级缓存-案例导入说明
  • 基于Python的自然语言处理系列(31):SpaCy + Training Neural Network
  • 在 cPanel 中管理区域编辑权限
  • web前端网页用户注册页面
  • 问题记录-- 在 Vue2 中动态更新 Select 组件的选项
  • Opencv形态学的膨胀操作、开运算与闭运算、梯度运算、礼帽与黑帽操作
  • keil 中添加gcc编译 stmf207
  • BEV相关
  • nodepad++带时间段的关键字搜索筛选
  • 【理论笔记】网工基础知识 1 —— 计算机网络基础知识
  • Z 字形变换
  • 在JasperReports中自动生成序列号
  • SpringBoot3 + MyBatisPlus 快速整合
  • 单片机(学习)2024.10.9