2013-06-13 6 views
0

Я основал свой код на примерах, найденных в documentation of Qt Quick 2.0, чтобы предоставлять данные в ListModel в моем QML динамически из C++.Вызов setContextProperty() с QList <MyObject*>

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: name is not defined

Я попытался с помощью qRegisterMetaType<T>() и qmlRegisterType<T>() без успеха. Что я делаю не так?

+0

Можете ли вы предоставить источник QML (или его часть) вместе с точной ошибкой? Вы уверены, что в вашем QML определен «audioInputDeviceInfoView»? Я не думаю, что вам нужно использовать qRegisterMetaType. – ChrisR

+0

@ChrisR Я добавил QML и ошибку. Если у вас установлены примеры qt5, вы можете попробовать его в «examples/quick/models/objectlistmodel». Если вы замените в Main.cpp QList на QList , вы получите ту же ошибку – koopajah

+0

Я не специалист и проблемы с Qt/QML. Может ли помочь одна из двух ссылок (даже если она предназначена для Qt4.8 вместо 5.0, она должна работать в основном): http://qt-project.org/doc/qt-4.8/qdeclarativemodels.html#exposing-c- data-models-to-qml http://cdumez.blogspot.com/2010/11/how-to-use-c-list-model-in-qml.html – ChrisR

ответ

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)); 

И, конечно, «импорт MyModel 1,0» в QML.

И это должно сработать!

+0

Это только частично работает: с вашим решением 'name' все еще не определено, мне нужно получить к нему доступ через' model.modelData.name'. И это сложнее, чем просто использовать 'QList '. Мой вопрос в том, почему он не работает с 'QList ' – koopajah

+0

Просто используйте modelData.name, у вас нет другого выбора с QML ListView или Repeater, вы должны использовать modelData при использовании модели на основе QObjectList. – TheBootroo

+0

Кстати, это хорошая практика всегда указывать 'modelData.' или «модель». перед именем свойства, чтобы избежать определения именования/определения области действия для механизма QML и избежать конфликтов определения. – TheBootroo

Смежные вопросы