【问题标题】:Copy all qt resources using cmake使用 cmake 复制所有 qt 资源
【发布时间】:2023-03-16 08:22:01
【问题描述】:

我想使用 cmake 编译 qml 应用程序。 这是我的 cmake 文件:

cmake_minimum_required(VERSION 3.3)
project(QMLTest)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)

find_package(Qt5Widgets REQUIRED)
find_package(Qt5Quick REQUIRED)

add_executable(QMLTest main.cpp)
include_directories(${Qt5Widgets_INCLUDES})
add_definitions(${Qt5Widgets_DEFINITIONS})
qt5_use_modules(QMLTest Widgets Quick )

还有main.cpp:

#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char** argv)
{
    QGuiApplication app(argc, argv);
    QQuickView view;
    view.resize(800, 480);
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.setSource(QUrl::fromLocalFile("gui/MainWidnow.qml"));
    view.show();
    return app.exec();
}

当我尝试编译它时,我得到一个错误:

gui/MainWidnow.qml:找不到文件。

如何将我所有的 qt 资源复制到应用程序目录中?

【问题讨论】:

    标签: c++ qt cmake qml


    【解决方案1】:

    我建议不要将 QML 文件复制到应用程序目录中,而是使用 Qt 的资源系统 (1),它允许您将 QML 文件等资源直接嵌入到可执行文件中。为此,您需要首先创建一个资源文件,例如resources.qrc 来注册您的应用程序资源:

    <!DOCTYPE RCC>
    <RCC version="1.0">
        <qresource>
            <file>gui/MainWindow.qml</file>
        </qresource>
    </RCC>
    

    然后将资源文件添加到 CMake 配置中。这将从您需要包含在应用程序源中的资源文件创建一个源文件:

    qt5_add_resources(RCC_SOURCES resources.qrc)
    add_executable(QMLTest ${RCC_SOURCES} main.cpp)
    

    完成此操作后,您可以使用:/gui/MainWindow.qml 格式的文件 URL 来引用该资源,该资源现在嵌入在您的应用程序二进制文件中。 Qt 会自动为你解决:

    view.setSource(QUrl(":/gui/MainWindow.qml"));
    

    Qt 文档中有更多关于部署 QML 应用程序的详细信息 (2)。

    【讨论】:

    • 最后一行对我不起作用,因为 QUrl 会寻找像 "path/:/gui/file.qml" 这样的路径。将其更改为 view.setSource(QUrl("qrc:/gui/MainWindow.qml")); 成功了
    • @DuKes0mE 这很令人惊讶,根据Qt documentation 和我的经验,它们是等效的。
    • 你试过 Qt5QuickCompiler:doc.qt.io/QtQuickCompiler/… 看起来一般你可以用 qtquick_compiler_add_resources() 替换 qt5_add_resources(),但是我不确定 AUTORCC 是否足够聪明,可以自己处理这个问题。
    【解决方案2】:

    我想扩展已接受的答案。 我会写这个作为评论,但我没有声誉。

    可以使用Qt独立的CMAKE函数调用代替qt5_add_resources()

    set(CMAKE_AUTORCC ON)
    add_executable(myexe main.cpp resource_file.qrc)
    

    然后你可以使用:/file_relative_to_qrc引用文件

    【讨论】:

      【解决方案3】:

      有多种方法可以做到这一点,例如:

      add_custom_target(copy-runtime ALL
          COMMAND cmake -E copy ${CMAKE_SOURCE_DIR}/gui/MainWindow.qml
              ${CMAKE_BINARY_DIR}
          DEPENDS QMLTest)
      

      我没有对此进行测试,但你会明白的。另一种选择是例如使用 CMake 的 install 命令通过“make install”在本地安装运行时文件。但是,在这种情况下,最好的选择是使用 Qt 的资源系统,就像 ajshort 在他的回答中推荐的那样,并将所需的文件嵌入到可执行文件中。

      【讨论】:

      • 我更喜欢符号链接而不是复制。您可能编辑了错误的文件或忘记重新复制。
      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多