2013-03-15 92 views
1

我希望能够从C++调用QML函数,并将自定义类的实例作为参数,然后从QML操作实例。从C++以自定义类型为参数的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)",为什么我不能访问数据的文本属性?

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

回答

2

尝试通过一个QObject指针来代替:

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

没有测试,但应该工作(QML认可的QObject *类型)。

+0

谢谢。它帮助!奇怪的是,这只能使用'QObject *'而不是'Data *'来存储分配的数据。 – 2013-03-17 20:58:14

+0

我认为是因为'Data'类型没有注册到QML,因此QML无法识别它。但QML可以识别'QObject *'类型。 – Dickson 2013-03-18 04:30:35