从C ++向QML ListModel追加元素

时间:2016-12-17 20:18:58

标签: c++ qt qml

我正在关注此示例,以了解如何使用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显示,但QML 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)

如何将其翻译为列表的长度?

1 个答案:

答案 0 :(得分:1)

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

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

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