我正在关注此示例,以了解如何使用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)
如何将其翻译为列表的长度?
答案 0 :(得分:1)
QList<QObject*>
是您可以使用的最简单但也是最笨的数据模型。它无法发出内部变化的信号,因此视图可以自行更新。
您可以通过将列表公开为具有NOTIFY
信号的属性来强制更新。但是,这是非常低效的,并且每次都会强制重新创建每个列表视图委托。随着元素数量的增加,这会变得非常快。
你应该考虑实施一个适当的QAbstractListModel
及其所有的花里胡哨。然后列表中的更改将以最有效和最充分的方式反映在qml端。或者也许使用我概述的通用模型here,它非常灵活,因为除了使用函数之外,它还允许使用声明性qml代码。您还可以在qml中定义实际的对象类型,而无需为每种新类型重新编译C ++内容。