Import QML module from resource file

The following project structure is working for import a qml module:

Project structure

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

How should I modify my project to import the module from a qrc file instead of adding any single file to the resources??

Ideally I'd like to have the following pro file:

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

I tried adding goofy.qrc (or Goofy.qrc) to my modules/Goofy folder with the following format:

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

but it doesn't work. What should I do?


Solution 1:

Your Goofy.rcc doesn't work because the files are not located in the used importPath. The files are next to the qrc, so no relative path is added to the specified prefix. Alter the rcc to the following to make it work:

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

As you already seem to understand, the qmldir file needs to be in the Goofy path for the QmlEngine to accept it. Add that to the specified import path and QmlEngine will find your module, just like it's on disk (since qrc is actually rendered as a normal filesystem)

BTW, You can check the working of relative qrc paths with the following snippet:

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