1

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

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

数据.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);

主文件

#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();
}

回调.qml

import QtQuick 2.0

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

控制台输出"Undefined". 我做错什么了吗 ?

将函数体更改为console.log(data)输出"QVariant(Data)"时,为什么我不能访问 data 的 text 属性?

我尝试Data使用注册为 QML 类型,qmlRegisterType<Data>();但这并没有改变任何东西。

4

1 回答 1

2

尝试传递一个 QObject 指针:

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

未经测试,但应该可以工作(QML 识别 QObject* 类型)。

于 2013-03-15T16:51:32.283 回答