来自C ++的QML回调,自定义类型作为参数

时间:2013-03-15 10:14:49

标签: c++ qt qml

我希望能够使用自定义类的实例作为参数从C ++调用QML函数,然后从QML中操作该实例。

这是我到目前为止所做的:

Data.h

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText)

    public :
        Data() : QObject(), _text("Foo")  { }
        virtual ~Data()                   { }
        Data(const Data & other)          { _text = other._text; }

        QString text() const               { return _text; }
        void setText(const QString & text) { _text = text; }

    private :
        QString _text;
};

Q_DECLARE_METATYPE(Data);

Main.cpp的

#include "Data.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Data callBackData;
    QQmlEngine engine;

    QQmlComponent rootComponent(&engine, QUrl::fromLocalFile("CallBack.qml"));
    QObject * rootObj = rootComponent.create();

    QMetaObject::invokeMethod(rootObj, "callMeBack",
                              Q_ARG(QVariant, QVariant::fromValue(callBackData)));

    return app.exec();
}

CallBack.qml

import QtQuick 2.0

Item {
    function callMeBack(data) {
        console.log(data.text)
    }
}

控制台输出"Undefined"。我做错了吗?

将函数体更改为console.log(data)时,它会输出"QVariant(Data)",为什么我无法访问数据的文本属性?

我尝试使用DataqmlRegisterType<Data>();注册为QML类型,但这不会改变任何内容。

1 个答案:

答案 0 :(得分:2)

尝试传递QObject指针:

Data *callbackData = new Data;
...
QMetaObject::invokeMethod(rootObj, "callMeBack",
                          Q_ARG(QVariant, QVariant::fromValue(callBackData)));

未经测试,但应该有效(QML识别QObject *类型)。