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

时间:2018-12-15 00:37:15

标签: qt qml qt5

我的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 个答案:

答案 0 :(得分:1)

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

import "./LockScreen/LockScreen"

尽管编辑器会丢失自动完成功能并引发警告。因此看来问题出在编辑器上,他在解释qresource别名时遇到问题。


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

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

main.qml

import "LockScreen"

LockScreen{
    // ...
}

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