20191210 QML 将指针传递给 QML Error: Unkown method return type: xxx*
程序员文章站
2022-03-09 13:33:49
...
目的:
针对 QML 调用 C++ 指针的两种情况进行说明
现象
直接在 QML 使用 MODEL{} 是可行,但是通过函数获取 C++ model 的指针却报错
Error: Unknown method return type: LabConfigModel*
说明:
1) 首先,确认是 QObject 对象的子类(以下展示直接是 QObject 子类的对象,情况一 )
class TestA : public QObject {
Q_OBJECT
public:
explicit TestA(QObject *parent=nullptr) {
}
Q_INVOKABLE inline void printT() {
qDebug() << "hello";
}
}
class TestB : public QObject {
Q_OBJECT
public:
explicit TestB(QObject *parent=nullptr) {
}
Q_INVOKABLE inline TestA* createObj {
return new TestA();
}
}
//file : main.c
...
qmlRegisterType<TestA>(); //也可以,只声明,接口等注册入 QML
qmlRegisterType<TestB>("TestB", 1, 0, "TestB");
...
// qml
import TestB 1.0
Item{
TestB {
id: testB
Component.onCompleted {
var a = testB.createObj();
a.printT();
}
}
}
解释:
1 由于 QObject* 是默认已经加入到 QML 中的,对于直接继承 QObject 的子类直接如此操作,便可以在 QML 调用指针
2 如果这样不可行,建议重新新建一个 C++ class ,头文件那边直接选择继承 QObject 即可
2) 但在实验中要使用 QML model 的 C++ 指针依据上面 1)步骤操作之后,发现依旧提示
Error: Unknown method return type: LabConfigModel*
在国外论坛中找到,对于不是直接继承 QObject 的子类且是自行创建的,需要向 QML 声明对应的指针
根据官方说法 这个方法一般被用于注册别名
qRegisterMetaType<LabConfigModel*>("LabConfigModel*");
只要在 1) 基础上,在 main.c 中添加一句就行