如何在 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
环境变量并使用相同的逻辑将其设置到正确的文件夹中。
您也可以将文件放在<Qt_installation_folder>/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 中创建自己的目录?的主要内容,如果未能解决你的问题,请参考以下文章