我有以下代码:
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
对象,则它不会更新我的模型(我读了{{1}通过复制传递,因此它没有连接到模型)。所以,我必须更新我的QStringList
,但这样我必须更新2个对象(QStringListModel
和QStringList
)并且似乎不是一个好习惯。解决问题的最佳方法是什么(如果存在)?
答案 0 :(得分:10)
QStringListModel
不允许您简单地添加字符串(遗憾的是)。简单地更新QStringList
不起作用,因为模型存储了列表的副本。
基本上有两种方法可以获得所需的行为:
<强> 1。复位:强>
这是一种简单的方法。您只需从模型中获取列表,添加字符串并重新分配:
QStringList list = m->stringList();
list.append("someString");
m->setStringList(list);
此方法确实有效,但有一个很大的缺点:视图将被重置。用户可能拥有的任何选择,排序或滚动位置都将丢失,因为模型会重置。
<强> 2。使用模型:
第二种方法是正确的做法,但需要更多的工作。在此,您使用QAbstractItemModel
的功能首先添加一行,然后更改它的数据:
if(m->insertRow(m->rowCount())) {
QModelIndex index = m->index(m->rowCount() - 1, 0);
m->setData(index, "someString");
}
这个版本可以正确更新视图并保持其状态。但是,如果要插入多行,或者删除/移动它们,这个会变得更复杂。
我的建议:使用2.方法,因为用户体验要好得多。即使您在多个地方使用该列表,也可以在使用m->stringList()
插入行后获取列表。
答案 1 :(得分:1)
您只需使用QStringListModel
提供的字符串列表 - 不要保留单独的副本,使用QStringListModel::stringList()
仅只读。要修改列表,请使用模型的方法:insertRows
,removeRows
和setData
,而不是使用QStringList
方法。