2016-05-20 3 views
1

Если мы хотим использовать список пользовательских C++ объекты в QML, мы можем использовать QQmlListPropertyКак редактировать QQmlListProperty в QML

При регистрации его в QML мы должны определить функцию, которая QML будет читать список с.

В документации говорится, что для полнофункционального списка мы должны использовать эту функцию:

QQmlListProperty::QQmlListProperty(QObject *object, void *data, AppendFunction append, 
            CountFunction count, AtFunction at, ClearFunction clear) 

Вот пример того, как я пишу это в C++:

classwithlist.h

#ifndef CLASSWITHLIST_H 
#define CLASSWITHLIST_H 

#include <QObject> 
#include <QQmlListProperty> 
#include "element.h" 

class Element; 

class ClassWithList : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QQmlListProperty<Element> elements READ getElements NOTIFY elementsChanged) 


public: 
    explicit ClassWithList(QObject *parent = 0); 

    QQmlListProperty<Element> getElements(); 
    void appendElements(QQmlListProperty<Element> *list, Element *e); 
    static int elementsCount(QQmlListProperty<Element> *list); 
    static Element* elementsAt(QQmlListProperty<Element> *list, int i); 
    static void elementsClear(QQmlListProperty<Element> *list); 

signals: 
    void elementsChanged(QQmlListProperty<Element>); 

private: 
    QList<Element *> m_elements; 

}; 

#endif // CLASSWITHLIST_H 

classwithlist.cpp

#include "classwithlist.h" 

ClassWithList::ClassWithList(QObject *parent) : QObject(parent) 
{ 

} 

QQmlListProperty<Element> ClassWithList::getElements() 
{ 
    return QQmlListProperty<Element>(this, m_elements, &appendElements,&elementsCount,&elementsAt,&elementsClear); 
} 
void ClassWithList::appendElements(QQmlListProperty<Element> *list, Element *e) 
{ 
    ClassWithList *cwl = qobject_cast<ClassWithList*>(list->object); 
    if (cwl && e) { 
     cwl->m_elements.append(e); 
    } 
} 
int ClassWithList::elementsCount(QQmlListProperty<Element> *list) 
{ 
    ClassWithList *cwl = qobject_cast<ClassWithList*>(list->object); 
    if (cwl) 
     return cwl->m_elements.count(); 
    return 0; 
} 
Element *ClassWithList::elementsAt(QQmlListProperty<Element> *list, int i) 
{ 
    ClassWithList *cwl = qobject_cast<ClassWithList*>(list->object); 
    if (cwl) 
     return cwl->m_elements.at(i); 
    return 0; 
} 
void ClassWithList::elementsClear(QQmlListProperty<Element> *list) 
{ 
    ClassWithList *cwl = qobject_cast<ClassWithList*>(list->object); 
    if (cwl) { 
     cwl->m_elements.clear(); 
    } 
} 

И после того, как обнажая класс QML я следующий код в QML

ClassWithList { 
    Component.onCompleted: { 
     console.log(elements.length) // works 
     console.log(elements[0])  // works 

//  elements.push()  // does not work 
//  elements.append() // does not work 
//  elements.clear()  // does not work 
//  elements.at()  // does not work 
    } 
} 

Могу ли я использовать функции, которые будут добавлять элементы в список или очистить его? Как видно выше, я могу использовать функции CountFunction и AtFunction с помощью .length и кронштейнов. Могу ли я как-то использовать ClearFunction и AppendFunction тоже?

Возможно, я не могу сделать это с помощью QQmlListProperty, и я должен использовать QAbstractListModel?

ответ

3

Вы не можете добавлять элементы или очищать QQmlListProperty непосредственно в QML. Чтобы изменить QQmlListProperty в QML, назначьте ему новый список.

Согласно QML listdocumentation:

Любое QQmlListProperty значение, передаваемое в QML из C++ автоматически преобразуется в значение list, и наоборот.

Обратите внимание, что объекты не могут быть индивидуально добавлены или удалены из списка после создания; для изменения содержимого списка, он должен быть переназначен в новый список.

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