如何在 QT QML 中创建自己的目录?

Posted

技术标签:

【中文标题】如何在 QT QML 中创建自己的目录?【英文标题】:How do I make my own directory in QT QML? 【发布时间】:2020-05-28 17:06:27 【问题描述】:

我正在尝试创建一个单独的 QML 文件“All.qml”的目录,我可以将它导入到我的项目的其他任何地方,以便我可以访问它的对象(即抽屉)。我制作了一个 qmldir 文件,与“All.qml”在同一文件夹中,甚至将目录添加到 .qrc 文件中。 目录内容如下:

Module App.Drawer

singleton All  1.0 All.qml

但是当我输入时

import App.Drawer.   1.0

它说“未安装模块'App.Drawer'”。我找不到任何其他方式来访问那个抽屉,因为这个项目很大,有多个文件夹和目录。谁能帮我?

此外,该项目还集成了 C++。我试着去寻找一些文件,其中可能已经安装了其他目录(还有其他自定义目录,它们是事先创建的),但找不到。

【问题讨论】:

【参考方案1】:

您必须确保QEngine 可以找到qmldir 文件,并且它对查找位置有一些特定要求。

首先要让QEngine 知道qmldir 文件,您必须添加一个导入路径:

engine.addImportPath("qrc:/");

您的路径可能会有所不同,请继续阅读:

qmldir 文件必须放在模块名称指定的文件夹结构中。在您的情况下,它是<rootPath>/App/Drawer/qmldir。我不知道“rootPath”,但假设您的 qrc 文件中有以下内容:

<RCC>
    <qresource prefix="/ProjectX/App/Drawer">
        <file>Drawer.qml</file>
        <file>qmldir</file>
    </qresource>
</RCC>

那么“rootPath”为qrc:/ProjectX,导入调用变为:

engine.addImportPath("qrc:/ProjectX");

另外,qmldir 中的module 声明应与放置qmldir 文件的文件夹结构相同。 (而且我认为应该是小写的)

module App.Drawer

singleton Drawer 1.0 Drawer.qml

如果您希望 Qt Creator 也能找到这些东西,您可以使用 QML2_IMPORT_PATH 环境变量并使用相同的逻辑将其设置到正确的文件夹中。

您也可以将文件放在&lt;Qt_installation_folder&gt;/qml/App/Drawer 中,但这意味着每个项目都可以使用它,并且您必须在开发过程中使其保持最新状态,这可能有些过头了。


编辑

要查看您的文件是否排列正确,您可以添加以下调试代码:

QDirIterator it(":", QDirIterator::Subdirectories);
while (it.hasNext()) 
    qDebug() << it.next();

【讨论】:

我在哪里写这个命令? engine.addImportPath() 一个?在 qmldir 文件中?还是我要导入的文件? 在你实例化QEngine之后,可能是main.cpp,在调用qengine.load('qrc:/main.qml')(或类似的)之前 表示将根文件夹(“/ProjectX”)标识为导入路径之一,但还是找不到模块。我希望这有助于找出问题所在。我是否必须使用某些特定的扩展名保存 qmldir? 您能否执行我在 main.cpp 中添加的调试代码并发布输出,如果它还不能帮助找到问题。如果您发布更多关于项目设置(.pro 文件、.qrc 文件)的信息,也可能会有所帮助。 qmldir 文件名就是这样,没有扩展名 好的,我执行了你添加的代码,这是控制台的输出。 “QML 调试已启用。仅在安全环境中使用。”随后是 .qrc 文件中引用的所有图像/qml 文件/文件等。文件列表还包括此输出中的我的 qmldir 文件以及“Drawer.qml”文件。但问题仍然存在。它仍然说找不到模块。即使它显然正在通过该文件。

以上是关于如何在 QT QML 中创建自己的目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何评价QML?

如何在 Qt QML 中创建多屏应用程序

使用具有UI控制的所有状态的1个图像在QT / QML中创建UI

如何在 Qt3D 中创建撤消/重做操作? [关闭]

如何在 QT 中创建功能区组件?

(更新)QT QML 5.6 - 是啥导致此警告“QApplication 未在 main() 线程中创建”?