Qt 6:CMake 生成的 qmldir 中的 prefer-field 阻止单例工作

Qt 6: Prefer-field in CMake-generated qmldir prevents singletons from working

提问人:juzzlin 提问时间:11/2/2023 最后编辑:juzzlin 更新时间:11/3/2023 访问量:50

问:

我有一本简单的手册,工作正常:qmldir

singleton Constants 1.0 Constants.qml

但是,现在我切换到并生成了它,它做了如下操作:qt_add_qml_module()qmldir

module MyApplication
typeinfo MyApplication.qmltypes
prefer :/MyApplication/
Main 1.0 Main.qml
singleton Constants 1.0 Constants.qml

这似乎是正确的,但现在应用程序在运行时无法再找到我的单例:

TypeError: Cannot call method 'connect' of undefined

我调试了这个问题,发现如果我删除单例,就会再次找到。我不明白这个问题,因为尽管有 -field,QML 引擎仍然可以加载其他 QML 文件,例如 Main.qml。preferprefer

这是怎么回事,如何解决?

我像这样启动应用程序:

engine->load("qrc:/MyApplication/Main.qml");

我尝试添加各种导入路径,但这似乎并不能解决它。

CMake 部分:

set_source_files_properties(Constants.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)

qt_add_qml_module(MyApplication
    URI MyApplication
    VERSION 1.0
    RESOURCE_PREFIX /
    QML_FILES
        Main.qml
        Constants.qml
)
C++ 、cmake qml 、qt6

评论

2赞 JarMan 11/2/2023
如果你添加它有效吗?import MyApplication
0赞 juzzlin 11/2/2023
实际上确实如此!只是Qt Creator不理解import语句,用红色下划线。

答:

2赞 JarMan 11/3/2023 #1

您只是在QML中缺少import语句。

import MyApplication

由于您现在使用的是模块,因此需要确保导入模块名称以访问单例。这有点令人困惑,因为在您的示例中,您的 Main.qml 似乎与单例位于同一模块中,因此认为导入是不必要的是可以理解的。我不确定为什么在需要导入时常规文件和单例之间存在差异。

评论

0赞 juzzlin 11/4/2023
Qt Creator不理解import语句增加了混乱。