gpt4 book ai didi

c++ - 从 C++ 将元素附加到 QML ListModel

转载 作者:行者123 更新时间:2023-11-28 05:22:23 24 4
gpt4 key购买 nike

我按照这个例子是为了了解如何将 QList 作为 QML 的 ListModel 使用。

我想从 C++ 修改列表。因此我将列表放入一个新的 QObject 中以便能够使用计时器。在计时器回调中,我修改了现有元素的颜色并将新元素附加到列表中。

void MyObject::setList(QList<QObject *>* l)
{
list = l;
QTimer* timer = new QTimer;
connect(timer, SIGNAL(timeout()), this, SLOT(addElement()));
timer->start(2000);
}

void MyObject::addElement()
{
list->append(new DataObject("Item 1", "red"));
((DataObject *) list->at(0))->setColor("blue");
}

颜色变化显示在 QML 中,但是 QMLs ListView 中列表的长度不会改变。我错过了什么?需要哪些步骤才能使 QML 了解列表的大小变化?

我了解颜色和名称属性是通过 Q_PROPERTY 宏注册的

Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)

我如何将其转换为列表的长度?

最佳答案

A QList<QObject*>是您可以使用的最简单但也是最笨拙的数据模型类型。它无法发出内部更改信号,因此 View 可以自行更新。

您可以通过将列表公开为具有 NOTIFY 的属性来强制更新信号。然而,这是非常低效的,并且每次都会强制重新创建每个 ListView 委托(delegate)。随着元素数量的增加,这会很快变得很难看。

您应该考虑实现适当的 QAbstractListModel带着它所有的花里胡哨。然后列表中的更改将以最有效和尽可能充分的方式反射(reflect)在 qml 端。或者也许使用我概述的通用模型 here ,它非常灵活,因为除了使用函数之外,它还允许使用声明性 qml 代码进行填充。您还可以在 qml 中定义实际的对象类型,而无需为每个新类型重新编译 C++ 内容。

关于c++ - 从 C++ 将元素附加到 QML ListModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com