如何在cmake中使用QML_ELEMENT 解决方案

问题描述

doc显示了我可以通过在qmake的.pro文件添加一些变量来使用QML_ELEMENT宏从C ++创建QML类型。但是我在用cmake

解决方法

据我所见,CMake尚未通过查看documentation来支持CONFIG += qmltypes,这是QML_ELEMENT所必需的,即使对于主分支也是如此。

通过util on the wip/cmake branch测试它们,为Qt6提供python .pro到cmake转换器的工作不是合并的,也不是据我所知无法正常工作(CMakeLists.txt没有相关信息)。 您可以看到实际的conversion script确实在CONFIG中测试了qmltypes的存在,但是似乎没有映射到可用于CMake的任何内容。

解决方案

请使用较旧的qmlRegisterType,而不要使用Qt 5.15(在撰写本文时为最新)中全新的QML_ELEMENTCONFIG += qmltypes,而应使用旧的Writting QML extensions for C++ | Qt 5.14从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,"YourQmlComponent");

    //Create your QML view or engine
}

只要您的代码/插件执行qmlRegisterType语句,这就不需要在项目文件方面进行任何特定的操作。

您可以参考Qt的文档,与您的页面相同,但要使用Qt 5.14而不是最新的文档,该文档准确地描述了以下内容:{{3}}

,

现在 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,如果您的导入失败,您可以查看这些文件以查看缺少哪些类型。我发现有时需要在添加/删除注册类型后进行完全重新编译。
  • Qt 示例已迁移到 cmake,因此请查看例如Examples/Qt-6.0.0/quick/tableview/gameoflife 看看它的实际效果
  • 现在在 pro2cmake.py 的 Qt 源中有 run_pro2cmake.pyQt/6.0.0/Src/qtbase/util/cmake 文件。在此 Readme 页面上提到了它们,您可以在 here 中找到它们,但我自己还没有尝试过。