【问题标题】:Why won't qml files load once I made them into a library?为什么将 qml 文件放入库后无法加载?
【发布时间】:2020-11-23 10:21:47
【问题描述】:

我的项目如下所示:

.
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    ├── main.cpp
    └── radon
        ├── main.qml
        ├── qml.qrc
        ├── radon.cpp
        └── radon.h

src/CMakeList.txt 定义了两个目标,一个库和一个链接到该库的可执行文件。

# only relevant code shown
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5 5.15 REQUIRED COMPONENTS Core Quick REQUIRED)
add_library(RadonCore
        radon/radon.h
        radon/radon.cpp
        radon/qml.qrc
        )

target_link_libraries(RadonCore
        PUBLIC Qt5::Core Qt5::Quick)

add_executable(RadonApp
        main.cpp)
target_link_libraries(RadonApp
        PRIVATE RadonCore)

该库仅包含我的应用程序的入口点,main.cpp 仅调用该入口。

// header
#ifndef RADON_RADON_H
#define RADON_RADON_H

namespace radon{
    int radon_entry(int argc, char* argv[]);
}

#endif //RADON_RADON_H
// source
#include "radon.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int radon::radon_entry(int argc, char* argv[])
{
    // only relevant code shown
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    engine.load(url);

    return QGuiApplication::exec();
}
// main.cpp
#include "radon/radon.h"

int main(int argc, char* argv[])
{
    return radon::radon_entry(argc, argv);
}

使条目独立于main() 的想法是,我可以将库链接到具有自己的main() 的测试。但是配置下qt报找不到main.qml

QQmlApplicationEngine failed to load component
qrc:/main.qml: No such file or directory

如果我在radon.cpp 内提供main() 并将其构建为可执行文件,那么它可以正常工作。什么给了?

qml.qrc 看起来像这样:

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

【问题讨论】:

    标签: qt cmake qml qtquick2


    【解决方案1】:

    问题在于RadonCore 是一个静态库。在 Qt 中,如果静态库使用资源,它必须在第一次使用之前将Q_INIT_RESOURCE 宏扩展至某处。有关更多信息,请参阅here。请注意,宏不能放置在任何命名空间内(不包括全局命名空间)。所以这个问题的解决方案应该是这样的:

    1. radon_entry 提取到全局命名空间
    2. Q_INIT_RESOURCE(qml) 的宏调用放在radon_entry 的第一行

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 1970-01-01
      • 2012-04-19
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2017-12-12
      • 1970-01-01
      相关资源
      最近更新 更多