如何在 cmake 中使用 QML_ELEMENT

How to use QML_ELEMENT with cmake

doc 表明我可以使用 QML_ELEMENT 宏通过在 qmake 的 .pro 文件中添加一些变量从 C++ 创建 QML 类型。但我正在使用 cmake

编辑 (Qt 6.x)

这个答案最初是为 Qt 5.15 发布的。现在 Qt 6 已经可用,如果您正在使用 Qt 6,请参阅 .

原始答案(Qt 5.x)

据我所知,CONFIG += qmltypes 是使用 QML_ELEMENT 所必需的,通过查看 documentation 在 CMake 中尚不支持,即使对于 master 分支也是如此。

并且努力提供 python .pro 到 cmake 转换器是针对 Qt6 的,没有合并,并且据我所知没有功能,通过 util on the wip/cmake branch 测试它们(CMakeLists.txt没有相关资料)。 您可以看到实际的 conversion script 确实在 CONFIG 中测试了 qmltypes 的存在,但它似乎没有映射到任何可用于 CMake 的东西。

解决方案

不要使用 QML_ELEMENTCONFIG += qmltypes,它们是 Qt 5.15 中的全新内容(写这篇文章时是最新的),目前 CMake 不支持它,而是使用旧的 qmlRegisterType 来自 C++:

#include "YouCustomCppClass.h"

int main(int argc, char** argv) {

    // Let you import it with "import ModuleName 1.0" on the QML side
    qmlRegisterType<YouCustomCppClass>("ModuleName", 1, 0, "YourQmlComponent");

    //Create your QML view or engine
}

只要您的 code/plugin 执行 qmlRegisterType 语句,项目文件端不需要任何特定内容。

您可以参考 Qt 的文档,与您的页面相同,但对于 Qt 5.14 而不是最新的,它准确描述了:Writting QML extensions for C++ | Qt 5.14

更新(Qt 6.2+)

从 Qt 6.2 开始,qt_add_qml_module 是用于构建 qml 模块的单个命令,它应该处理几乎所有事情,取代旧的 qt6_qml_type_registration 命令。

旧答案 (Qt 6.0/6.1)

现在 Qt 6.0 已经支持,尽管文档很少。您现在需要的是:

set_target_properties(foo PROPERTIES
    QT_QML_MODULE_VERSION 1.0
    QT_QML_MODULE_URI     Foo
)

qt6_qml_type_registration(foo)

然后你可以在 qml 中做:

import Foo

并且您将可以访问具有 QML_ELEMENT 和朋友的类型。备注:

  • 在构建输出文件夹中创建了两个文件,<project>_qmltyperegistrations.cpp<project>.qmltypes,如果您的导入失败,您可以查看这些文件以查看缺少哪些类型。我发现我有时需要在 adding/removing 注册类型后进行完全重新编译。
  • Qt 示例已迁移到 cmake,因此请查看例如Examples/Qt-6.0.0/quick/tableview/gameoflife 实际观看
  • Qt/6.0.0/Src/qtbase/util/cmake 的 Qt 源中现在有 pro2cmake.pyrun_pro2cmake.py 文件。 Readme page, you can find them here 上提到了它们,我自己还没有尝试过。