版权声明:本文为博主原创文章,欢迎转载,转载请注明出处 https://blog.csdn.net/MatchYang/article/details/52988257

在直接使用QStandardItemModel存取数据时,必须考虑线程安全问题

  1. 以下是使用场景: 
      QListView用于显示图片缩略图,而整个view有一万以上的缩略图,也就是说item项在一万以上 
    在大量的数据插入过程中,void QStandardItemModel::appendRow(QStandardItem *item) 这个函数是比较慢的,即使插入空的QStandarItem而不填充任何数据,一万项数据的插入操作也是级别的,所以需要用到线程来进行插入操作

  2. 以下是问题: 
      在void QStandardItemModel::appendRow(QStandardItem *item) 运行于其他非UI主线程时,完成操作后UI会在更新数据后主动刷新,这时,QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const函数会读取Qt::SizeHintRole的数据,我们就会遇到data的写跟读在不同线程同时被访问的问题

  3. 以下是我的解决方法:

    • 继承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

最新文章

  1. error LNK2001: 无法解析的外部符号
  2. 走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1
  3. sublime安装插件步骤
  4. 源码编译安装screen
  5. 大家一起和snailren学java-(13)字符串
  6. Unity3D使用Assetbundle打包加载(Prefab、场景)
  7. robot API笔记1
  8. Unity3D脚本中文系列教程(十一)
  9. fastdb中的位图应用
  10. Class File Editor: Source not found
  11. spark - 从HDFS加载文件并分析
  12. /etc/fstab自动挂载文件系统
  13. HDU 5141
  14. IOS学习之路二十二(UIAlertView获得文本框内容及添加北京图片)
  15. 遍历CheckBox根据指定条件做筛选js
  16. java web(三):ServletContext、session、ServletConfig、request、response对象
  17. 【转】学习Robot Framework必须掌握的库—-BuiltIn库
  18. Notepad++ 列操作
  19. iOS 在object-c 中调用c文件 方法
  20. 使用maven-shade-plugin插件解决spark依赖冲突问题

热门文章

  1. Android面试题集
  2. android:padding 与 android:margin的差别
  3. HDU 5493 Queue 树状数组+二分
  4. 高斯混合模型Gaussian Mixture Model (GMM)——通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布
  5. 院校-美国:美国国立卫生研究院(NIH)
  6. 5.listview(QStringList QStringListModel)
  7. crawler4j多线程爬虫统计分析数据
  8. js前台编码,asp.net后台解码 防止前台传值到后台为乱码
  9. onmouse事件与mouse事件
  10. Android 自定义ScrollView的滑动监听事件