2013-03-15 103 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