如何在 QML 中编辑 QQmlListProperty
How to edit QQmlListProperty in QML
如果我们想在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
类保留列表.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
?
编辑:由于列表属性界面的变化,下面的答案不再完全正确。现在可以使用push
(来自下面链接的文档)追加对象:
可以使用 push 方法将值动态添加到列表中,就好像它是 JavaScript 数组一样
原答案如下
<小时 />不能直接在 QML 中将元素追加或清除QQmlListProperty
。要在 QML 中编辑QQmlListProperty
,请为其分配一个新列表。
根据QML list
文档:
从C++传递到 QML 的任何
QQmlListProperty
值都会自动转换为list
值,反之亦然。请注意,对象在创建后不能单独添加到列表中或从列表中删除;要修改列表的内容,必须将其重新分配给新列表。
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 编辑文件中的文本
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- SetDlgItemInt 不会更改嵌入资源的编辑框
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- C++,Qt:仅在双击后编辑qtablewidget项目
- 编辑字符串以包含括号 c++ 之间的变量
- Arduino函数无法编辑数组
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- "未定义对'WinMain@16'的引用"gcc 编辑器中的错误
- C++MFC编辑框处理双击
- 是否可以使用指针访问变量以避免直接编辑变量?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 在 c++ 中编辑注册表项
- 无法将行编辑中的文本打印到 Qt C++ 中的标签
- 尝试使用 CMake 和 MinGW64 进行构建时出现多个编辑错误
- 如何从C++而不是虚幻编辑器中添加静态网格体组件的值?
- UE4 - Visual Studio在我从编辑器添加新的c ++文件后无法打开任何源文件 - UBT_COMPILED
- Qt如何将行编辑连接到进度条
- 使用 bash 脚本和测试处理进行代码编辑