您的位置:首页 > 编程语言 > Qt开发

往QStandarItemModel插入数据的正确姿势

2017-01-06 00:32 579 查看

我是需求

现实需求是,我在使用QStandarItem来存储数据,model使用的是QStandarItemModel,但是因为数据量非常大,打开一个View的时候要加载上万个数据,所以,就使用线程往model里插入数据了,下面是插入的部分代码:

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);


不要问我当初为何要这么逗逼,我自己都想不起来了,果然写了神奇代码要注释。。。

下面说问题。

我是问题

线程不断执行上述插入代码的时候,m_model->appendRow(new QStandardItem());实际只是插入一个空项,而View需要根据model的数据以确定在渲染的时候如何提供post、geometry,这样第一个线程插入空项的时候,view开始准备计算geometry巴拉巴拉的了,好了,这时候第二个线程就来插了一腿了,你懂的,没算完又开始下一个了,所以整个视图抖动的很鬼畜。画面太美,还是不上图了。

当然出现这个问题,跟我自己的delegate处理有关(我设置了setUniformItemSizes,而且我的delegate会使用item中的size),不是每个人这样操作都有问题,这里要说的就是,在数据处理线程与UI线程交互中,应该要注意类似的问题。

解决办法很简单:

我是解决方案

QStandardItem *item = new QStandardItem;
item->setData(QVariant(getVariantList(info)), Qt::DisplayRole);
item->setData(QVariant(iconSize()), Qt::SizeHintRole);
m_model->appendRow(item);


跟发生问题前的代码区别在哪?额,开始你是占着茅坑不XX,活该被踹出来;现在你是已经解开腰带才进去的,谁能动你。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt MVC 线程