2013-03-15 2 views
1

Я хотел бы иметь возможность вызывать функцию QML из C++ с экземпляром настраиваемого класса в качестве параметра, а затем манипулировать экземпляром из QML.Обратный вызов QML из C++ с настраиваемым типом как параметр

Вот что я сделал до сих пор:

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)", так почему я не могу получить доступ к текстовому свойству данных?

Я пробовал регистрировать Data как тип QML с использованием qmlRegisterType<Data>();, но это ничего не меняет.

ответ

2

Постарайся передать указатель на QObject вместо:

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

Не тестировался, но должен работать (QML признать QObject * типа).

+0

Спасибо. Это помогло! Как ни странно, это работает только с использованием 'QObject *' вместо 'Data *' для хранения выделенных данных. –

+0

Я думаю, потому что тип 'Data' не регистрируется в QML, поэтому QML не может его распознать. Но QML может распознавать тип 'QObject * '. – Dickson

Смежные вопросы