如何在 QML 中编辑 QQmlListProperty

Posted

技术标签:

【中文标题】如何在 QML 中编辑 QQmlListProperty【英文标题】:How to edit QQmlListProperty in QML 【发布时间】:2016-05-20 08:07:06 【问题描述】:

如果我们想在 QML 中使用自定义 C++ 对象列表,我们可以使用 QQmlListProperty

在 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
    

我可以使用将项目添加到列表或将其清除的功能吗?如上所示,我可以通过使用.length 和括号来使用函数CountFunctionAtFunction。我也可以使用ClearFunctionAppendFunction 吗?

也许我不能用 QQmlListProperty 做到这一点,我应该使用 QAbstractListModel

【问题讨论】:

【参考方案1】:

编辑:由于列表属性界面的变化,下面的答案不再完全正确。现在可以使用push(来自下面链接的文档)附加对象:

可以使用 push 方法将值动态添加到列表中,就好像它是一个 javascript 数组

原答案如下


您不能直接在 QML 中将元素附加到或清除 QQmlListProperty。要在 QML 中编辑 QQmlListProperty,请为其分配一个新列表。

根据QMLlistdocumentation:

任何从 C++ 传递到 QML 的 QQmlListProperty 值都会自动转换为 list 值,反之亦然。

请注意,对象一旦创建就不能单独添加到列表中或从列表中删除;要修改列表的内容,必须将其重新分配给新列表。

【讨论】:

以上是关于如何在 QML 中编辑 QQmlListProperty的主要内容,如果未能解决你的问题,请参考以下文章

QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?

在 Qml 代码中编辑 C++ QList<Object*> 模型的问题和一些 Qml 警告

从 qml 编辑 QObject 属性

使用多个视图在 QML 中查看、编辑和更新数据(来自 C++),而数据保留在 C++ 中(订阅数据)

初识QML

初识QML