如何在 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
和括号来使用函数CountFunction
和AtFunction
。我也可以使用ClearFunction
和AppendFunction
吗?
也许我不能用 QQmlListProperty
做到这一点,我应该使用 QAbstractListModel
?
【问题讨论】:
【参考方案1】:编辑:由于列表属性界面的变化,下面的答案不再完全正确。现在可以使用push
(来自下面链接的文档)附加对象:
可以使用 push 方法将值动态添加到列表中,就好像它是一个 javascript 数组
原答案如下
您不能直接在 QML 中将元素附加到或清除 QQmlListProperty
。要在 QML 中编辑 QQmlListProperty
,请为其分配一个新列表。
根据QMLlist
documentation:
任何从 C++ 传递到 QML 的
QQmlListProperty
值都会自动转换为list
值,反之亦然。请注意,对象一旦创建就不能单独添加到列表中或从列表中删除;要修改列表的内容,必须将其重新分配给新列表。
【讨论】:
以上是关于如何在 QML 中编辑 QQmlListProperty的主要内容,如果未能解决你的问题,请参考以下文章
QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?
在 Qml 代码中编辑 C++ QList<Object*> 模型的问题和一些 Qml 警告