QStandardItemModel的data线程安全
来源:互联网 发布:怎么接淘宝家具安装 编辑:程序博客网 时间:2024/04/29 16:38
在直接使用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、大量数据准备好了,开始新线程插入数据到modelQtConcurrent::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();}
0 0
- QStandardItemModel的data线程安全
- QStandardItemModel的用法
- QStandardItemModel的使用
- QStandardItemModel
- QStandardItemModel
- QListView 和 QStandardItemModel的使用
- QStandardItemModel 自动被析构的问题
- Core Data线程安全及BUG解决
- QListView,QTreeView和 QStandardItemModel的简单使用
- QListView,QTreeView和 QStandardItemModel的简单使用
- 线程安全非线程安全的区别
- 安全释放 TreeView的DATA!
- java的线程安全
- 线程安全的SyncArrayList
- 线程的安全删除
- 创建安全的线程
- 线程安全的队列
- 安全的线程同步
- Linux之——线程通信(一)
- tabhost基本用法(一)
- 组合数
- ECMAScript6标准异步操作和Async函数
- ubuntu常见问题与设置(by 星空武哥)
- QStandardItemModel的data线程安全
- FOF基金的七大投资策略
- python入门--数据类型
- 蛇形填数
- 数据结构与算法之最短路径--迪杰斯特拉算法
- FragmentTabHost切换Fragment时避免重复加载UI(ViewPager切换Fragment时也适用)
- LeetCode-303. Range Sum Query - Immutable
- getifaddr函数及相关结构体总结
- Java面向对象(二)