20191210 QML 将指针传递给 QML Error: Unkown method return type: xxx*

目的:

针对 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 中添加一句就行

发布了120 篇原创文章 · 获赞 27 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_24890953/article/details/103481695