【问题标题】:Appending Elements to QML ListModel from C++从 C++ 将元素附加到 QML ListModel
【发布时间】:2016-12-18 04:48:16
【问题描述】:

我遵循这个示例是为了了解如何将 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 makro 注册的

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

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

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    QList&lt;QObject*&gt; 是您可以使用的最简单但也是最愚蠢的数据模型类型。它无法发出内部更改的信号,因此视图可以自行更新。

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

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

    【讨论】:

    • 我在想最简单的方法是开始学习的最佳方法...谢谢!
    • 简单就像“不必要的复杂性非常糟糕”一样好,但“最简单”往往也“非常有限”。
    • @Gege 自定义列表模型实际上并不比将 QList 公开为属性复杂得多。我想说实际上更容易,因为您不必做两个基于 QObject 的类。使用自定义模型,您的数据可以位于您喜欢的任何数据结构中,例如简单的类或结构、元组数组等但是,既然您说您正在学习,我仍然建议您修复原始问题首先,通过在公开列表的属性更改时发出通知信号。在其他场合你将需要这种技术
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多