文档显示,通过在qmake的.pro文件中添加一些变量,我可以使用QML_ELEMENT宏从C++创建QML类型。但我用的是cmake
更新(Qt 6.2+(
从Qt 6.2开始,Qt_add_qml_module是一个用于构建qml模块的单一命令,它几乎可以处理所有内容,取代了旧的qt6_qml_type_registration
命令。
旧答案(问题6.0/6.1(
现在Qt6.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
以了解它的作用 - 现在在
Qt/6.0.0/Src/qtbase/util/cmake
的Qt源中有pro2cmake.py
和run_pro2cmake.py
文件。它们在这个Readme页面上被提到,你可以在这里找到它们,我自己还没有尝试过
编辑(问题6.x(
这个答案最初发布于5.15问题。既然Qt 6可用,如果你正在使用Qt 6,请参阅@Adversus的答案。
原始答案(问题5.x(
从我所看到的情况来看,使用QML_ELEMENT
所需的CONFIG += qmltypes
在CMake中还不受支持,即使对于master分支也是如此。
提供python.pro到cmake转换器的工作是针对Qt6的,没有合并,而且据我所知,通过在wip/cmake
分支上从util测试它们,它们不起作用(CMakeLists.txt没有相关信息(。您可以看到,实际的转换脚本确实测试了CONFIG中qmltypes
的存在,但它似乎没有映射到任何可用于CMake的内容。
解决方案
不要使用QML_ELEMENT
和CONFIG += qmltypes
,这是Qt 5.15中全新的(编写本文时最新的(,并且目前CMake不支持,而是使用C++中的旧qmlRegisterType
:
#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
}
只要您的代码/插件执行qmlRegisterType
语句,这就不需要项目文件端的任何特定内容。
您可以参考Qt的文档,与您的文档相同,但针对Qt 5.14而不是最新文档,该文档准确地描述了:为C++编写QML扩展| Qt 5.14