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);

メイン.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 の 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 に答える