Qt资源文件的格式,并用CMake添加Qt资源文件 | 您所在的位置:网站首页 › 从成都开车到西双版纳要几个小时 › Qt资源文件的格式,并用CMake添加Qt资源文件 |
目录......QRC文件的写法用CMake添加Qt资源文件添加QRC文件的函数步骤CPP中使用QRC文件使用QRC文件实例程序结果QRC文件CMakeLists.txt文件Dialog.h文件Dialog.cpp文件main.cpp文件......因为开题,荒废了一个多月没学习,感觉除了对MATLAB还有点印象,C++/Qt基本都忘得差不多了。前天开题完了,准备从头重新复习一下。 上午折腾了两小时的用CMake添加Qt资源文件的问题。主要是:'Unknown CMake command "QT5_ADD_RESOURCES"'这个error,我脑袋一时短路没整明白,折腾两小时后才解决,于是做篇推送记录一下。 其实之前也没用过资源文件,都是把图片或者文件放在文件夹中跟exe程序放一块来调用。不过既然是复习,就一块学了吧。qt的资源文件还是很好用的,直接把资源文件编译到exe程序里了,不用附加了,比较清爽。不过比较大的文件还是不要放到QRC里了,一般都是放点图片啥的。 还有,这是我写的最快的一次推送,差不多一个小时把。 QRC文件的写法 # 这个是文件头,用来说明是一个RCC文件# 这个和下面的中间填写资源 # 这个 和下面的中间填写资源文件路径(相对路径) images/mainPic.jpg # 相对路径要包含在和中间 images/icon.png 如图:资源文件写好了,下面就要添加了。 用CMake添加Qt资源文件添加QRC文件的函数qt5_add_resources步骤set(CMAKE_AUTORCC ON),这个要先写上set(QRC_FILE resource.qrc)qt5_add_resources(QRC ${QRC})具体的解释看下面的注释吧(左右滑动)set(CMAKE_AUTORCC ON) # 这个要写上set(QRC_FILE resource.qrc) # 可能有多个QRC文件,我这里就写了一个,这行是把所有的QRC文件名赋值给 QRC_FILE变量(变量名自己取) qt5_add_resources(QRC ${QRC_FILE}) # 用这个函数把这些QRC文件添加进来 # QRC文件需要参与编译,所以在add_library和add_executable中可能都需要添加(如果你在库或者主程序中使用了QRC资源的话),比如:add_executable(20 main.cpp Dialog.cpp Dialog.h ${QRC}) # 记得把资源文件也参与编译! Note: 你可能会出现:Unknown CMake command "QT5_ADD_RESOURCES" 这样的错误!这是因为你在使qt5_add_resources这个函数之前没有使用find_package来导入Qt5的库,qt5_add_resources是Qt5的CMake文件中的函数。所以你必须要先用find_package来导入QT5的包,然后才能使用qt5_add_resources来添加资源文件。CPP中使用QRC文件this->setWindowIcon(QPixmap(":/images/icon.png"));mainPic->setPixmap(QPixmap(":/images/mainPic.jpg"));就这样用,:/ + 在QRC文件中写的相对路径。下面举一个使用QRC文件的例子 使用QRC文件实例首先,我把qrc文件和包含图片的文件夹与主CMakeLists.txt文件放在同一级目录中,那么这个资源图片的相对路径就是: images/xxx.png。关于项目结构就不具体描述了,之前也写了一篇CMake的推送,那里面有说。 程序结果QRC文件文件名自己随便取 images/mainPic.jpg images/icon.png CMakeLists.txt文件cmake_minimum_required(VERSION 3.10)project(20)set(CMAKE_CXX_STANDARD 14) set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON) ## 一定要在使用 qt5_add_resources前调用find_package.因为你需要先导入Qt5的库后才会有qt5_add_resources这个函数。## qt5_add_resources这个函数是在qt5的CMakeLists.txt的库中。所以以后还是在开头导入库为好。set(Qt5_DIR "C:\\Qt\\Qt5_12_MSVC\\lib\\cmake\\Qt5") # Windows中find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) # 添加资源文件(添加好的资源要参与编译,所以add_library和add_executable中都可能需要加)set(QRC_FILE resource.qrc)qt5_add_resources(QRC ${QRC_FILE}) add_executable(20 main.cpp Dialog.cpp Dialog.h ${QRC}) # 记得把资源文件也参与编译! target_link_libraries(20 PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets) Dialog.h文件//// Created by MitchHong on 2020/7/4.//#include #include #include #include #include class Dialog : public QDialog{ Q_OBJECT public: explicit Dialog(QWidget* parent = nullptr);// ~Dialog() Q_DECL_OVERRIDE = default; private: QLabel* mainPic; //主显示图片 QPushButton* closeBtn; //关闭按钮 private: void setupDialog(); void setupConnections();}; Dialog.cpp文件在这里使用QRC资源文件!//// Created by MitchHong on 2020/7/4.//#include "Dialog.h" Dialog::Dialog(QWidget* parent): QDialog(parent), mainPic(new QLabel), closeBtn(new QPushButton("Close")){ setupDialog(); setupConnections();} void Dialog::setupDialog(){ this->setFixedSize(500, 500); this->setWindowIcon(QPixmap(":/images/icon.png")); mainPic->setPixmap(QPixmap(":/images/mainPic.jpg")); mainPic->setScaledContents(true); auto* lay = new QVBoxLayout; lay->addWidget(mainPic); auto* lay1 = new QHBoxLayout; lay1->addStretch(1); lay1->addWidget(closeBtn); lay->addLayout(lay1); this->setLayout(lay);} void Dialog::setupConnections(){ connect(closeBtn, &QPushButton::clicked, this, [this]()->void{ this->close(); });} main.cpp文件#include #include "Dialog.h"int main(int argc, char* argv[]) { QApplication app(argc, argv); Dialog w; w.show(); return QApplication::exec();} ---END--- ----------------------------------------------------------------------------------------------------------------------我们尊重原创,也注重分享,文章来源于微信公众号:MatlabGUI QtCPP等学习记录,建议关注公众号查看原文。如若侵权请联系[email protected]。---------------------------------------------------------------------------------------------------------------------- |
CopyRight 2018-2019 实验室设备网 版权所有 |