Qt QML包含来自不同目录的问题

Posted

技术标签:

【中文标题】Qt QML包含来自不同目录的问题【英文标题】:Qt QML include from different directory problem 【发布时间】:2018-12-15 00:37:15 【问题描述】:

我的 QML 文件有一个类似的目录结构:

qml.qrc
main.qml
LockScreen/
  LockScreen.qml
QuickMenu/
  QuickMenu.qml
misc/
  KeyboardInput.qml

(我已经排除了其他文件,但这不相关)

我已将上述所有文件添加到我的 qrc 文件中,每个目录都有前缀:

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
        <file>qtquickcontrols2.conf</file>
        <file>MessagePopup.qml</file>
        <file>MessagePopupForm.ui.qml</file>
    </qresource>
    <qresource prefix="/LockScreen">
        <file>LockScreen/LockScreen.qml</file>
        <file>LockScreen/fingerprint.png</file>
        <file>LockScreen/fingerprint_highlighted.png</file>
    </qresource>
    <qresource prefix="/MainPages">
        <file>MainPages/LibraryPage.qml</file>
        <file>MainPages/CameraPage.qml</file>
        <file>MainPages/MessagesPage.qml</file>
        <file>MainPages/HomePage.qml</file>
        <file>MainPages/saturn.jpg</file>
    </qresource>
    <qresource prefix="/QuickMenu">
        <file>QuickMenu/QuickMenu.qml</file>
    </qresource>
    <qresource prefix="/misc">
        <file>misc/KeyboardInput.qml</file>
    </qresource>
</RCC>

我的问题是当我像这样导入每个前缀时

import "misc"
import "MainPages"
import "QuickMenu"
import "LockScreen"

在我的 main.qml 中,我收到一条错误消息,指出我的一个 QML 对象不是类型。

QQmlApplicationEngine failed to load component
qrc:/main.qml:67 LockScreen is not a type

奇怪的是,我可以使用 QtCreator 的智能感知访问我的所有对象,在我构建和运行应用程序之前,一切似乎都可以正常导入。有没有办法使 qrc 路径过时或什么?还是旧的缓存文件?

【问题讨论】:

【参考方案1】:

问题是由似乎在路径中添加级别的前缀引起的,因此在您的情况下,导入应该是:

import "./LockScreen/LockScreen"

虽然编辑器失去了自动完成功能并抛出了警告。因此,问题似乎出在解释 qresource 别名的编辑器上。


更好的选择是为 .qml 文件使用别名:

...
<qresource prefix="/LockScreen">
    <file alias="LockScreen.qml">LockScreen/LockScreen.qml</file>
    ...

ma​​in.qml

import "LockScreen"

LockScreen
    // ...

注意:别名必须有 .qml 扩展名,否则 Qt Creator 将无法正确识别它

【讨论】:

别名有效,但我很困惑为什么导入时无法识别默认文件名?这是否意味着我必须给 qrc 中的每个文件一个别名? @AndrewLoomis 前缀为路径增加了一层,当有很多层时,Qt Creator 似乎无法识别属性。是的,如果你想使用前缀,你将不得不设置一个别名,如果你删除它们,你就不会遇到这个问题

以上是关于Qt QML包含来自不同目录的问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt/Qml:如何包含地图瓦片以供离线使用?

✿4-The Basics-Qt Quick and QML

✿4-The Basics-Qt Quick and QML

Qml c++ 不同的委托 qt mvc

✿4-The Basics-Qt Quick and QML

Qt-Qml:将复选框绑定到 QAbstractListModel