如何更新QStringListModel

时间:2016-05-24 11:49:37

标签: c++ qt model-view-controller

我有以下代码:

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

其中gc.get_lista_file()返回QStringList个对象,lista_immagini_listViewQListView。 当我按下按钮时,我需要更新我的lista_immagini_listView添加字符串,但如果我将新字符串添加到我的QStringList对象,则它不会更新我的模型(我读了{{1}通过复制传递,因此它没有连接到模型)。所以,我必须更新我的QStringList,但这样我必须更新2个对象(QStringListModelQStringList)并且似乎不是一个好习惯。解决问题的最佳方法是什么(如果存在)?

2 个答案:

答案 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()只读。要修改列表,请使用模型的方法:insertRowsremoveRowssetData,而不是使用QStringList方法。