找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

Qt资源文件的格式,并用CMake添加Qt资源文件

admin 2020-7-4 15:10 187人围观 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文件的写法

<!DOCTYPE RCC>  # 这个是文件头,用来说明是一个RCC文件

<RCC version="1.0"> # 这个<RCC>和下面的</RCC>中间填写资源
    <qresource> # 这个<qresource> 和下面的</qresource>中间填写资源文件路径(相对路径)
        <file>images/mainPic.jpg</file> # 相对路径要包含在<file>和</file>中间
        <file>images/icon.png</file>
    </qresource>

</RCC>

如图:



资源文件写好了,下面就要添加了。

用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文件


文件名自己随便取
<!DOCTYPE RCC>
<RCC version="1.0">
    <qresource>
        <file>images/mainPic.jpg</file>
        <file>images/icon.png</file>
    </qresource>

</RCC>

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 <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

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 <QApplication>
#include "Dialog.h"

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    Dialog w;

    w.show();

    return QApplication::exec();
}


---END---






----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:MatlabGUI QtCPP等学习记录,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......