往QStandarItemModel插入数据的正确姿势

来源:互联网 发布:c语言void的用法 编辑:程序博客网 时间:2024/04/29 18:50

我是需求

现实需求是,我在使用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,活该被踹出来;现在你是已经解开腰带才进去的,谁能动你。

0 0