Я хотел бы иметь возможность вызывать функцию 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>();
, но это ничего не меняет.
Спасибо. Это помогло! Как ни странно, это работает только с использованием 'QObject *' вместо 'Data *' для хранения выделенных данных. –
Я думаю, потому что тип 'Data' не регистрируется в QML, поэтому QML не может его распознать. Но QML может распознавать тип 'QObject * '. – Dickson