找回密码
 立即注册
收起左侧

怎么解决tableview显示数据多时效率低的问题

1
回复
3069
查看
[复制链接]
累计签到:25 天
连续签到:1 天
来源: 2017-8-23 22:30:20 显示全部楼层 |阅读模式
10Qter豆
本帖最后由 dearcc 于 2017-8-24 20:41 编辑

  1. void Dialog::on_btn1_clicked()
  2. {
  3.     QTime time;
  4.     time.start();
  5.     int count = 500;
  6.     ui->tableView->setUpdatesEnabled(false);
  7.     m_pModel->setRowCount(count);
  8.     for(int i = 0 ; i < count; ++i)
  9.     {
  10.         for(int j = 0; j < 10; ++j)
  11.         {
  12.             QStandardItem *item = m_pModel->item(i,j);
  13.             if(NULL == item)
  14.             {
  15.                 item = new QStandardItem("btn1");
  16.                 m_pModel->setItem(i,j,item);
  17.             }
  18.             else
  19.             {
  20.                 if(item->text() != "btn_1")
  21.                     item->setText("btn_1");
  22.             }
  23.         }
  24.     }
  25.     ui->tableView->setUpdatesEnabled(true);
  26.     qDebug() << "btn1 " << time.elapsed();
  27. }

  28. void Dialog::on_btn2_clicked()
  29. {
  30.     QTime time;
  31.     time.start();
  32.     int count = 1000;
  33.     ui->tableView->setUpdatesEnabled(false);
  34.     m_pModel->setRowCount(count);
  35.     for(int i = 0 ; i < count; ++i)
  36.     {
  37.         for(int j = 0; j < 10; ++j)
  38.         {
  39.             QStandardItem *item = m_pModel->item(i,j);
  40.             if(NULL == item)
  41.             {
  42.                 item = new QStandardItem("btn2");
  43.                 m_pModel->setItem(i,j,item);
  44.             }
  45.             else
  46.             {
  47.                 if(item->text() != "btn_2")
  48.                     item->setText("btn_2");
  49.             }
  50.         }
  51.     }
  52.     ui->tableView->setUpdatesEnabled(true);
  53.     qDebug() << "btn2 " << time.elapsed();
  54. }

  55. void Dialog::on_btn3_clicked()
  56. {
  57.     QTime time;
  58.     time.start();
  59.     int count = 2000;
  60.     ui->tableView->setUpdatesEnabled(false);
  61.     m_pModel->setRowCount(count);
  62.     for(int i = 0 ; i < count; ++i)
  63.     {
  64.         for(int j = 0; j < 10; ++j)
  65.         {
  66.             QStandardItem *item = m_pModel->item(i,j);
  67.             if(NULL == item)
  68.             {
  69.                 item = new QStandardItem("btn3");
  70.                 m_pModel->setItem(i,j,item);
  71.             }
  72.             else
  73.             {
  74.                 if(item->text() != "btn_3")
  75.                     item->setText("btn_3");
  76.             }
  77.         }
  78.     }
  79.     ui->tableView->setUpdatesEnabled(true);
  80.     qDebug() << "btn3 " << time.elapsed();
  81. }
复制代码

描述:
1、一个tableview,对应了一个standarm item model,将model和view关联,只对model进行数据操作;
2、分三次操作(三个按钮,按钮1加载500行,按钮2加载1000行,按钮3加载1000行):
1)model加载500行10列数据,耗时40ms左右;只执行此操作(反复点击按钮加载),多次后为7ms完成;
2)model不清除原有500行数据,新增500行,共显示1000行,时间1200ms左右,多次加载为10ms左右;
3)model切换1000行数据(更新1000),耗时600ms左右,多次点击耗时2400ms左右;
4)以上三次操作反复切换,耗时会越来越多,不明白为什么?(不调用model的clear函数,都是处理行的增加和减少,clear后耗时更多)。
3、现象时,反复点击一个按钮加载数据,耗时不多;但换一个按钮加载数据,哪怕行数一样,耗时也会增加很多,导致界面刷新卡顿。
4、对table view进行setUpdateEnable操作,在刷新前false,刷新后true,可以一定程度提升效率,但不明显。
望大神给出指导意见,万分感谢!
目前只知道行数不足,需要增加行时,new standard item的时候耗时;还有在行多时,remove行耗时;并且耗时都非常严重。
关键,在行数相同时,只是更新一下数据(按钮1、2切换),耗时也会非常严重,2秒多呢!

回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2019-3-13 11:13:22 显示全部楼层
Model/view可以解决,但不采用文档实力的传递list作为参数,量大时list比较耗时,直接传递list所在对像的指针,然后通过该对象来刷新model
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册