从本地文件系统加载 qml component/file

Load qml component/file from local file system

我的应用程序具有以下结构:

有一个 main.cpp 从 qrc 文件加载名为 main.qml 的文件。

qrc 内容:

在这个 main.qml 中,我正在加载其他 qml components/files,它们也存储在 qrc 中。这按预期工作。

main.qml

Component.onCompleted:{
    var component=Qt.createComponent("WidgetQmlInQrc.qml")
    widget=component.createObject(mainWindow,params)
}

我想在 main.qml.

中使用存储在本地文件系统中的 qml components/files

本地 qml 文件:/mnt/plugin/WidgetQmlExternal.qml

import QtQuick 2.0;

Rectangle {
    color:"green";
    CustomUiElement {
    }    
}

首先我尝试扩展 qml 导入路径:

viewer->engine()->addImportPath("/mnt/plugin/"); 

这没有用。

之后我尝试使用完整路径加载组件。 现在找到并加载了 WidgetQmlExternal.qml,但是找不到 CustomUiElement.qml,因为外部 qml 无法访问 qrc 中的文件。

Component.onCompleted:{
    var component=Qt.createComponent("/mnt/plugin/WidgetQmlExternal.qml")
    widget=component.createObject(mainWindow,params)
}

我该如何解决这个问题/我必须更改我的应用程序的结构才能加载外部组件,从而再次重用我的一些自定义组件?

以下是我想到的一些选项:

使用加载程序加载基于 QRC 的内部 QML 文件

WidgetQmlExternal.qml:

import QtQuick 2.0

Rectangle {
    anchors.fill: parent
    color: "red"

    Loader {
        source: "qrc:/WidgetQmlInQrc.qml"
    }
}

有趣的是,Qt 本身就是这样公开的 certain assets

将基于 QRC 的内部 QML 文件公开为 QML 模块

您可以阅读更多相关信息 here

我也为此苦苦挣扎,直到我意识到您可以简单地为 url 添加前缀以强制它查看本地文件系统,例如

Loader {
    source: "file:/mnt/plugin/WidgetQmlExternal.qml"
}

使用这种方法,加载程序加载的组件也将能够通过 QRC 访问其他组件。希望对您有所帮助。