从本地文件系统加载qml组件/文件

时间:2016-05-03 09:20:08

标签: qml qt-quick

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

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

qrc的内容:

  • /qml/main.qml
  • /qml/CustomUiElement.qml
  • /qml/WidgetQmlInQrc.qml

在这个main.qml中,我正在加载其他qml组件/文件,这些组件/文件也存储在qrc中。这可以按预期工作。

main.qml

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

我想在main.qml中使用存储在本地文件系统中的qml组件/文件。

本地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)
}

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

2 个答案:

答案 0 :(得分:1)

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

使用Loader

加载基于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的更多信息。

答案 1 :(得分:0)

我一直在努力解决这个问题,直到我意识到你可以简单地在网址前加上强制它来查看本地文件系统,例如。

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

使用此方法,Loader加载的组件也可以访问具有QRC的其他组件。希望有所帮助。