将元素附加到C 的QML ListModel

Appending Elements to QML ListModel from C++

本文关键字:QML ListModel 元素      更新时间:2023-10-16

我正在遵循此示例,以了解如何将Qlist作为QML的列表模型。

我想从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 makro

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

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

a QList<QObject*>是您可以使用的最简单但最愚蠢的数据模型类型。它无需向内部更改发出信号,以便该视图可以自行更新。

您可以通过将列表公开为具有NOTIFY信号的属性来强制更新。但是,这是非常效率的,并且会迫使每次列表视图的娱乐活动委托。随着元素数量的增长,这会变得非常丑陋。

您应该考虑用其所有铃铛和哨声实现适当的QAbstractListModel。然后,列表中的更改将以最有效,最适当的方式在QML侧反映。或者也许使用我在此处概述的通用模型,它非常灵活,因为它还允许使用声明性QML代码的人群使用这些功能。您还可以在QML中定义实际对象类型,而无需重新编译每种新类型的C 内容。