我的代码基于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时得到错误,表明属性名称未定义:
独有:视图。qml:10: ReferenceError: name is not defined
我尝试使用qRegisterMetaType<T>()
和qmlRegisterType<T>()
没有成功。我做错了什么?
保持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中的' import MyModel 1.0 '。