如何在 cmake 中使用 QML_ELEMENT

너를 *_*속였다 9 c++ qt cmake qml qt5

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

Adr*_*vat 9

从我所见,通过查看文档,CMake 尚不支持CONFIG += qmltypes使用,即使对于 master 分支也是如此。QML_ELEMENT

并且通过wip/cmake分支上util测试它们(CMakeLists.txt 没有相关信息),为 Qt6 提供 python .pro 到 cmake 转换器的努力,没有合并,并且据我所知没有功能。您可以看到实际的转换脚本确实测试了qmltypesCONFIG 中的存在,但它似乎没有映射到任何可用于 CMake 的东西。

解决方案

而不是使用QML_ELEMENTand CONFIG += qmltypes,它是 Qt 5.15 中的全新(编写本文时的最新版本),并且目前不受 CMake 支持,而是使用qmlRegisterTypeC++ 中的旧版本:

#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
}
Run Code Online (Sandbox Code Playgroud)

只要您的代码/插件执行qmlRegisterType语句,这将不需要项目文件方面的任何特定内容。

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


Adv*_*sus 5

现在 Qt 6.0 出来了,虽然没有很好的记录,但它已经得到支持。你现在需要的是:

set_target_properties(foo PROPERTIES
    QT_QML_MODULE_VERSION 1.0
    QT_QML_MODULE_URI     Foo
)

qt6_qml_type_registration(foo)
Run Code Online (Sandbox Code Playgroud)

然后你可以在 qml 中做:

import Foo
Run Code Online (Sandbox Code Playgroud)

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

  • 两个文件的生成输出文件夹中创建,<project>_qmltyperegistrations.cpp并且<project>.qmltypes,如果进口失败,你可以看看那些看哪些类型的缺失。我发现有时在添加/删除注册类型后我需要进行完全重新编译。
  • Qt 示例已迁移到 cmake,因此请查看 egExamples/Qt-6.0.0/quick/tableview/gameoflife以查看其实际效果
  • Qt 源文件中现在有pro2cmake.pyrun_pro2cmake.py文件,位于Qt/6.0.0/Src/qtbase/util/cmake. 他们在这个自述页面上提到,你可以在这里找到它们,我自己还没有尝试过。

  • @Adverus你能举个例子来说明如何使用qt_add_qml_module吗?文档让我发疯。 (2认同)