gpt4 book ai didi

c++ - 如何更新 QStringListModel?

转载 作者:可可西里 更新时间:2023-11-01 17:36:47 29 4
gpt4 key购买 nike

我有以下代码:

QStringListModel* m=new QStringListModel(gc.get_lista_file());
ui->lista_immagini_listView->setModel(m);

其中 gc.get_lista_file() 返回一个 QStringList 对象,而 lista_immagini_listView 是一个 QListView

我需要更新我的 lista_immagini_listView 在我按下按钮时添加一个字符串,但是如果我将我的新字符串添加到我的 QStringList 对象它不会更新我的模型(我读到 QStringList 是通过拷贝传递的,所以它没有连接到模型)。所以,我必须更新我的 QStringListModel 但这样我必须更新 2 个对象(QStringListQStringListModel)并且看起来不是好的做法。

解决它的最佳方法是什么(如果存在)?

最佳答案

QStringListModel 不允许您简单地添加一个字符串(很遗憾)。简单地更新 QStringList 是行不通的,因为模型存储了列表的拷贝。

基本上有两种方法可以获得所需的行为:

<强>1。重置:
这是简单的方法。您只需从模型中获取列表,添加字符串并重新分配它:

QStringList list = m->stringList();
list.append("someString");
m->setStringList(list);

这种方法确实有效,但有一个很大的缺点: View 将被重置。用户可能拥有的任何选择、排序或滚动位置都将丢失,因为模型已重置。

<强>2。使用模型:
第二种方法是正确的做法,但需要做更多的工作。在此您使用 QAbstractItemModel 的函数首先添加一行,然后更改它的数据:

if(m->insertRow(m->rowCount())) {
QModelIndex index = m->index(m->rowCount() - 1, 0);
m->setData(index, "someString");
}

这个确实正确地更新了 View 并保持了它的状态。但是,如果您想插入多行或删除/移动它们,这会变得更加复杂。

我的建议:使用2.方法,因为用户体验要好很多。即使您在多个地方使用列表,您也可以在使用 m->stringList() 插入行后获取列表。

关于c++ - 如何更新 QStringListModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37412712/

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