文档显示,通过在qmake的.pro文件中添加一些变量,我可以使用QML_ELEMENT宏从C++创建QML类型。但我用的是
发布于 2021-01-01 13:56:03
更新(Qt 6.2+)
从QT6.2开始,模块是一个用于构建qml模块的单一命令,它应该处理几乎所有的事情,其中包括替换旧的qt6_qml_type_registration命令。
旧答案(QT6.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中创建了两个文件,如果导入失败,可以查看这些文件是否缺少哪些类型。我发现,有时在添加/删除已注册类型之后,需要进行完全重新编译。Examples/Qt-6.0.0/quick/tableview/gameoflife,看看它的作用pro2cmake.py的Qt源代码中有Qt/6.0.0/Src/qtbase/util/cmake和run_pro2cmake.py文件。在这个自述页面中提到了它们,您可以找到它们,这里,还没有亲自尝试过。发布于 2020-08-21 15:26:51
编辑(QT6.x)
这个答案最初是为QT5.15发布的。现在Qt 6已经可用,如果您使用的是Qt6,请参考@Adversus的回答。
原答案(Qt 5.x)
据我所见,CONFIG += qmltypes是使用QML_ELEMENT所必需的,通过查看文档,甚至对于主分支,CMake中还不支持它。
向cmake转换器提供python .pro的工作是针对Qt6的,而不是合并的,而且据我所知,通过从分支中测试它们( CMakeLists.txt没有相关信息),它们没有功能。您可以看到,实际的转换脚本确实测试qmltypes在配置中的存在,但是它似乎没有映射到任何对CMake有用的东西。
解决方案
与其使用QML_ELEMENT和CONFIG += qmltypes (这是QT5.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的文档,与您的文档相同,但用于QT5.14,而不是最新的,它准确地描述了:写C++的QML扩展--QT5.14
https://stackoverflow.com/questions/63509161
复制相似问题