从资源文件导入 QML 模块

Import QML module from resource file

以下项目结构正在导入 qml 模块:

项目结构

Project
|- modules
    |- Goofy
       |- qmldir
       |- Donald.qml
|- project.pro
|- main.cpp
|- main.qml
|- qml.qrc

project.pro

QT += quick

SOURCES += \
        main.cpp

RESOURCES += \
   modules/Goofy/Donald.qml \
   modules/Goofy/qmldir \
   qml.qrc

QML_IMPORT_PATH = $$PWD/modules
QML_DESIGNER_IMPORT_PATH = $$PWD/modules

main.cpp

   QQmlApplicationEngine engine;
   engine.addImportPath("qrc:/modules");

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import Goofy 1.0

Window {
   width: 640
   height: 480
   visible: true
   title: qsTr("Hello World")

   Donald{}
}

qmldir

module Goofy
Donald 1.0 Donald.qml

我应该如何修改我的项目以从 qrc 文件导入模块,而不是将任何单个文件添加到资源?

理想情况下,我想要以下 pro 文件:

project.pro

QT += quick

SOURCES += \
        main.cpp

RESOURCES += \
   modules/Goofy/goofy.qrc \ 
   qml.qrc

QML_IMPORT_PATH = $$PWD/modules
QML_DESIGNER_IMPORT_PATH = $$PWD/modules

我尝试将 goofy.qrc(或 Goofy.qrc)添加到我的 modules/Goofy 文件夹,格式如下:

<RCC>
    <qresource prefix="/">
        <file>qmldir</file>
        <file>Donald.qml</file>
    </qresource>
</RCC>

但它不起作用。我该怎么办?

您的 Goofy.rcc 不起作用,因为文件不在使用的 importPath 中。这些文件在 qrc 旁边,因此没有相对路径添加到指定的前缀。将 rcc 更改为以下内容以使其工作:

<RCC>
    <qresource prefix="/modules/Goofy">
        <file>qmldir</file>
        <file>Donald.qml</file>
    </qresource>
</RCC>

您似乎已经明白,qmldir 文件需要位于 Goofy 路径中,QmlEngine 才能接受它。将其添加到指定的导入路径,QmlEngine 将找到您的模块,就像它在磁盘上一样(因为 qrc 实际上呈现为普通文件系统)

顺便说一句,您可以使用以下代码片段检查相对 qrc 路径的工作情况:

QDirIterator qrc(":", QDirIterator::Subdirectories);
while(qrc.hasNext())
{
    qDebug() << qrc.next();
}