QML 导入模块

Posted

技术标签:

【中文标题】QML 导入模块【英文标题】:QML importing module 【发布时间】:2016-02-29 11:46:25 【问题描述】:

我想在我的main.qml 文件中导入一个自定义模块。 Main.qml 位于我的 qml.qrc 资源的 "/" 前缀下。

我的自定义模块Config.qml 位于Config 子目录中。 (Config 目录是main.qml 所在的位置,即/path/to/main/Config/Config.qml

config.qmlqmldir 文件存储在 qml.qrc 文件中的前缀 myPrefix 下。

Project
|- Config
    |- Config.qml
    |- qmldir
|- main.qml

我还根据必要的文档http://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html 创建了一个qmldir 文件。这是我的Config.qmlqmldir 文件。

Config.qml

pragma Singleton
import QtQuick 2.0
QtObject 
    property int myVariable: 10

qmldir

singleton Config 1.0 Config.qml

当我想在main.qml 文件中将我的自定义模块作为MyModule 导入时。

import "???" as MyModule

我该怎么做?有人有什么建议吗?

编辑:

qrc 文件

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

【问题讨论】:

模块文件夹不应该和模块同名吗? 当我更改为模块 Config 时,也不适用于 import Config 1.0 【参考方案1】:

来自documentation:

模块的 qmldir 文件必须驻留在导入路径内的目录结构中,该目录结构反映了 URI 点分标识符字符串,其中标识符中的每个点(“.”)反映了目录树中的一个子级别。例如,模块 com.mycompany.mymodule 的 qmldir 文件必须位于导入路径某处的子路径 com/mycompany/mymodule/qmldir 中。

所以你应该将module MyModule 更改为module Config 或在特定路径中导入:

import "./Config" as MyModule

【讨论】:

我认为问题是,我在 qml.qrc 文件中有一个 Config 目录的前缀,并且 import 语句还应该包括 qrc:/prefix/... 不知何故。但我不知道怎么做。可以在Config目录前写一个带前缀的例子吗? 我编辑了我原来的问题并添加了相关的 .qrc 文件【参考方案2】:

** 在Arpegius的回答之后问题已经改变提出另一个问题,我回答这个新问题。 **

这与 qrc-prefix 无关。 我相信您正在混合使用两种不同的导入方法。


无论有无前缀,导入模块需要相应设置QtQuick引擎的import-path

在您的情况下,因为您的模块目录位于项目根目录中:

engine.addImportPath("qrc:/");
// Now engine will look for subfolders which could be modules == with a qmldir

在您的 main.qml 中,您使用前缀路径而不是文件系统路径进行导入:

import myPrefix 1.0 as MyNamespace

您也可以导入简单的 QML 文件,而不是作为模块:

// Because the path is relative to main.qml even in a qrc
import "myPrefix" as MyNamespace

那么你根本不需要 qmldir。

【讨论】:

【参考方案3】:

如果这对任何人来说仍然是一个问题,您可以右键单击文件并选择将文件添加到目录。然后选择要添加 qml 文件的目录。该目录应与主 qml 文件相同。这样做解决了我的问题

【讨论】:

以上是关于QML 导入模块的主要内容,如果未能解决你的问题,请参考以下文章

尝试将外部 QML 模块导入我的项目时出错

QML模块在项目中有哪些优势?

QML 模块在项目中的优势是啥?

导入 JavaScript 时如何在 QML 中使用绝对路径?

qml导入js添加别名

qml: 模块定义与使用