- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下代码:
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 个对象(QStringList
和 QStringListModel
)并且看起来不是好的做法。
解决它的最佳方法是什么(如果存在)?
最佳答案
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/
我是一名优秀的程序员,十分优秀!