gpt4 book ai didi

gridview - 在运行时更改 QML GridView 模型

转载 作者:行者123 更新时间:2023-12-04 18:12:55 25 4
gpt4 key购买 nike

我在 QT 和 QML 中定义了一个基于 QAbstractListModel 的类,我将此模型设置为 GridView。它工作完美。如果我更改模型中的数据,我会调用重置函数,GridView 会显示更新的数据。但是有时我会更改完整的模型数据(即不仅数据更改,而且其计数也更改)。在这种情况下,当我重置数据时,GridView 不会显示更新的模型。我还尝试为我的模型创建一个新对象并更改了 GridView 模型,但仍然没有效果。

这是基本的代码片段。

// DataEngine.h
class DataEngine : public QAbstractListModel
{
Q_OBJECT
public:
.....
public: // Overrides
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
}
// main.c
DataEngine *data = new DataEngine();
view.rootContext()->setContextProperty("DataModel", data)

// QML File
GridView {
.....
id: view
model: DataModel
.....
}

// After completely changing data (i.e earlier it has 256 rows, now it has say 0 row)
// I tried
view.rootContext()->setContextProperty("NewDataModel", data)
// QML Code
view.model = NewDataModel // No effect.

在我看来,数据正在发生变化,但 GridView 并未使用新数据进行更新。

任何帮助表示赞赏。

此致,
法鲁克·阿尔沙德

最佳答案

我怀疑您没有通知底层基础模型您的数据已更改。见 this section QAbstractItemModel 的详细信息,以了解您需要在子类中执行的操作。特别是,下面这句话说了很多:

在实现这些功能时,重要的是要通知任何连接的 View 在模型尺寸发生之前和之后发生的变化:

如果要删除减少数据,则必须提供 removeRows 的实现,如果要增加数据,则必须提供 insertRows 的实现。就我而言,因为我有来自自己来源的数据,所以我只是删除了该数据并将 rowIndex 返回为 0 无效。我刚刚添加了一个空的 removeRows 实现,其中 beginRemoveRows 和 endRemoveRows 在 return true 内,并发出了这个信号。有了这个信号,我的 View 知道数据计数发生了变化,所以它调用了 rowCount 函数,我返回了 0。

关于gridview - 在运行时更改 QML GridView 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com