Я основал свой код на примерах, найденных в документация по Qt Quick 2.0 предоставить данные ListModel
в моем QML динамически из C ++.
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>()
безуспешно. Что я делаю неправильно?
Сохраняйте класс 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));
И, конечно, «импортировать MyModel 1.0» в QML.
И это должно работать!
Других решений пока нет …