我希望能够使用自定义类的实例作为参数从C ++调用QML函数,然后从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)"
,为什么我无法访问数据的文本属性?
我尝试使用Data
将qmlRegisterType<Data>();
注册为QML类型,但这不会改变任何内容。
答案 0 :(得分:2)
尝试传递QObject指针:
Data *callbackData = new Data;
...
QMetaObject::invokeMethod(rootObj, "callMeBack",
Q_ARG(QVariant, QVariant::fromValue(callBackData)));
未经测试,但应该有效(QML识别QObject *类型)。