如何在 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_ELEMENT
和 CONFIG += 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.py
和 run_pro2cmake.py
文件。 Readme page, you can find them here 上提到了它们,我自己还没有尝试过。
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_ELEMENT
和 CONFIG += 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.py
和run_pro2cmake.py
文件。 Readme page, you can find them here 上提到了它们,我自己还没有尝试过。