QStandardItemModel的data线程安全(在插入数据时,临时禁止sizeHint去读model中的data)
2024-08-31 12:14:59
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处 https://blog.csdn.net/MatchYang/article/details/52988257
在直接使用QStandardItemModel存取数据时,必须考虑线程安全问题
以下是使用场景:
QListView用于显示图片缩略图,而整个view有一万以上的缩略图,也就是说item项在一万以上
在大量的数据插入过程中,void QStandardItemModel::appendRow(QStandardItem *item) 这个函数是比较慢的,即使插入空的QStandarItem而不填充任何数据,一万项数据的插入操作也是秒级别的,所以需要用到线程来进行插入操作以下是问题:
在void QStandardItemModel::appendRow(QStandardItem *item) 运行于其他非UI主线程时,完成操作后UI会在更新数据后主动刷新,这时,QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const函数会读取Qt::SizeHintRole的数据,我们就会遇到data的写跟读在不同线程同时被访问的问题以下是我的解决方法:
- 继承QAbstractItemModel实现数据读写,在读写过程中加入QMutex锁
- 在插入数据时,临时禁止sizeHint去读model中的data
明显,第一种方式更为合理,但是如果你项目比较紧急,用第二种方法吧,就酱。
////////////////////////////////上段代码方便记录//////////////////////////////////////////////
//1、大量数据准备好了,开始新线程插入数据到model
QtConcurrent::run(m_frames[currentTL], &TimelineViewFrame::insertItems, currentInfos);
//2、循环插入过程
void TimelineViewFrame::insertItems(const DBImgInfoList &infos)
{
using namespace utils::image;
for (auto info : infos) {
ThumbnailListView::ItemInfo vi;
vi.name = QByteArray::fromPercentEncoding(info.fileName.toUtf8());
vi.path = QByteArray::fromPercentEncoding(info.filePath.toUtf8());
vi.thumb = cutSquareImage(getThumbnail(vi.path, true));
m_view->insertItem(vi);
}
}
//3、每一个插入过程
void ThumbnailListView::insertItem(const ItemInfo &info)
{
// Diffrent thread connection cause duplicate insert
if (indexOf(info.path) != -1)
return;
m_model->appendRow(new QStandardItem());
QModelIndex index = m_model->index(m_model->rowCount() - 1, 0);
m_model->setData(index, QVariant(getVariantList(info)), Qt::DisplayRole);
m_model->setData(index, QVariant(iconSize()), Qt::SizeHintRole);
// updateViewPortSize();
}
https://blog.csdn.net/MatchYang/article/details/52988257
最新文章
- error LNK2001: 无法解析的外部符号
- 走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1
- sublime安装插件步骤
- 源码编译安装screen
- 大家一起和snailren学java-(13)字符串
- Unity3D使用Assetbundle打包加载(Prefab、场景)
- robot API笔记1
- Unity3D脚本中文系列教程(十一)
- fastdb中的位图应用
- Class File Editor: Source not found
- spark - 从HDFS加载文件并分析
- /etc/fstab自动挂载文件系统
- HDU 5141
- IOS学习之路二十二(UIAlertView获得文本框内容及添加北京图片)
- 遍历CheckBox根据指定条件做筛选js
- java web(三):ServletContext、session、ServletConfig、request、response对象
- 【转】学习Robot Framework必须掌握的库—-BuiltIn库
- Notepad++ 列操作
- iOS 在object-c 中调用c文件 方法
- 使用maven-shade-plugin插件解决spark依赖冲突问题
热门文章
- Android面试题集
- android:padding 与 android:margin的差别
- HDU 5493 Queue 树状数组+二分
- 高斯混合模型Gaussian Mixture Model (GMM)——通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布
- 院校-美国:美国国立卫生研究院(NIH)
- 5.listview(QStringList QStringListModel)
- crawler4j多线程爬虫统计分析数据
- js前台编码,asp.net后台解码 防止前台传值到后台为乱码
- onmouse事件与mouse事件
- Android 自定义ScrollView的滑动监听事件