繁体   English   中英

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

[英]Appending Elements to QML ListModel from C++

我遵循此示例,以了解如何将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)

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

QList<QObject*>是您可以使用的最简单但也是最愚蠢的数据模型类型。 它没有信号通知内部更改,因此视图可以自行更新。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM