vol*_*ssa 8 c++ model-view-controller qt
我有以下代码:
QStringListModel* m=new QStringListModel(gc.get_lista_file());
ui->lista_immagini_listView->setModel(m);
Run Code Online (Sandbox Code Playgroud)
其中gc.get_lista_file()
返回一个QStringList
对象和lista_immagini_listView
一个QListView
.我需要更新我lista_immagini_listView
添加一个字符串,当我按下一个按钮,但如果我在我的新字符串添加到我的QStringList
对象时不更新我的模型(我读的QStringList
是通过复制传递,因此它没有连接到模型) .所以,我必须更新我,QStringListModel
但这样我必须更新2对象(QStringList
和QStringListModel
),似乎不是一个好习惯.解决它的最佳方式(如果存在)是什么?
Fel*_*lix 11
QStringListModel
不允许你简单地添加一个字符串(遗憾的是).简单地更新QStringList
它不起作用,因为模型存储列表的副本.
基本上有两种方法可以获得所需的行为:
1.重置:
这是一种简单的方法.您只需从模型中获取列表,添加字符串并重新分配:
QStringList list = m->stringList();
list.append("someString");
m->setStringList(list);
Run Code Online (Sandbox Code Playgroud)
这种方法确实有效,但有一个很大的缺点:视图将被重置.用户可能具有的任何选择,排序或滚动位置将丢失,因为模型被重置.
2.使用模型:
第二种方法是正确的做法,但需要更多的工作.在这里你使用的函数QAbstractItemModel
首先添加一行,然后更改它的数据:
if(m->insertRow(m->rowCount())) {
QModelIndex index = m->index(m->rowCount() - 1, 0);
m->setData(index, "someString");
}
Run Code Online (Sandbox Code Playgroud)
这个可以正确地更新视图并保持其状态.但是,如果要插入多行,或者删除/移动它们,这个会变得更复杂.
我的建议:使用2.方法,因为用户体验要好得多.即使您在多个位置使用该列表,也可以在使用后插入行后获取列表m->stringList()
.