我将代码基于documentation of Qt Quick 2.0中的示例,以便从C ++动态地向我的QML中的ListModel
提供数据。
MyModel.h :
class MyObject: public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
public:
MyObject(QObject *parent=0);
~MyObject();
QString name() const;
void setName(const QString &name);
QString deviceName;
Q_SIGNALS:
void nameChanged();
};
QML文件:
import QtQuick 2.0
ListView {
width: 100; height: 100
model: myModel
delegate: Rectangle {
height: 25
width: 100
Text { text: name }
}
}
在我的 Main.cpp 中,我现在创建了一个QList<QObject *>
,我填写了MyModel
的一些实例并且它有效:
QList<QObject *> listElems;
listElems.append(new MyModel());
listElems.append(new MyModel());
QQmlContext *ctxt = view->rootContext();
ctxt->setContextProperty("myModel",QVariant::fromValue(listElems));
但是如果不是使用QList<QObject *>
而是使用QList<MyObject *>
,那么在加载QML时会出现错误,表明属性名称未定义:
qrc:view.qml:10:ReferenceError:未定义名称
我尝试使用qRegisterMetaType<T>()
和qmlRegisterType<T>()
但没有成功。我做错了什么?
答案 0 :(得分:1)
保持MyModel类和QML方面相同,只需更改以下部分:
#include <qqml.h>
qmlRegisterUncreatableType<MyModel>("MyModel", 1, 0, "MyModel", "Instanciated C++ side !");
QVariantList listElems;
listElems.append(QVariant::fromValue(new MyModel()));
listElems.append(QVariant::fromValue(new MyModel()));
view->rootContext()->setContextProperty("myModel",QVariant::fromValue(listElems));
当然,在QML中“导入MyModel 1.0”。
它应该有效!