• QTableView获取可见的行数


    场景

          当我们需要实时刷新QTableView时,而此时tableView的数据量较大,如果全部刷新显然不合理,如果可以只对用户看的到的数据进行刷新那就最好了,经过一番摸索找到了几种方式,可供参考

    代码

    方法1

    1. QVector<int> getVisibleRows(QTableView* tableView)
    2. {
    3. QVector<int> visibleRows;
    4. int numRows = tableView->model()->rowCount();
    5. //可见的第一行
    6. int firstVisibleRow = tableView->rowAt(0);
    7. if (firstVisibleRow != -1)
    8. {
    9. //可见的最后一行
    10. int lastVisibleRow = tableView->rowAt(tableView->viewport()->height() - 1);
    11. if (lastVisibleRow == -1)
    12. {
    13. lastVisibleRow = numRows - 1;
    14. }
    15. //遍历所有可见行
    16. for (int row = firstVisibleRow; row <= lastVisibleRow; ++row)
    17. {
    18. visibleRows.append(row);
    19. }
    20. }
    21. return visibleRows;
    22. }

    方法2

    1. QVector<int> getVisibleRows2(QTableView* tableView)
    2. {
    3. QVector<int> visibleRows;
    4. QAbstractItemModel* model = tableView->model();
    5. QRect viewportRect = tableView->viewport()->rect();
    6. int numRows = model->rowCount();
    7. for (int row = 0; row < numRows; ++row)
    8. {
    9. QModelIndex index = model->index(row, 0);
    10. QRect rowRect = tableView->visualRect(index);
    11. if (rowRect.isValid() && viewportRect.intersects(rowRect))
    12. {
    13. visibleRows.append(row);
    14. }
    15. }
    16. return visibleRows;
    17. }

    对比

        现在来写一个main函数,简单测试一下哪种方法更有效率:

    1. int main(int argc, char *argv[])
    2. {
    3. QApplication a(argc, argv);
    4. // 创建一个QTableView并设置数据模型
    5. QTableView* tableView = new QTableView;
    6. QStandardItemModel model(10000, 2);
    7. tableView->setModel(&model);
    8. QPushButton* btnPrint = new QPushButton("GetRows");
    9. QObject::connect(btnPrint, &QPushButton::clicked, [tableView]() {
    10. // 获取可见行的索引
    11. QElapsedTimer timer;
    12. timer.start();
    13. //第一种方式
    14. QVector<int> visibleRows = getVisibleRows(tableView);
    15. //第二种方式
    16. QVector<int> visibleRows = getVisibleRows2(tableView);
    17. qint64 elapsed = timer.elapsed(); // 获取经过的毫秒数
    18. qDebug() << "Time elapsed:" << elapsed << "milliseconds";
    19. qDebug() << "Visible Rows:";
    20. for (int row : visibleRows)
    21. qDebug() << row;
    22. });
    23. QVBoxLayout* mainLayout = new QVBoxLayout;
    24. mainLayout->addWidget(tableView);
    25. mainLayout->addWidget(btnPrint);
    26. QWidget* mainWin = new QWidget;
    27. mainWin->setLayout(mainLayout);
    28. mainWin->show();
    29. return a.exec();
    30. }

       我模拟了10000行的数据,两种方式下的耗时分别为

     方法1:

     方法2

  • 相关阅读:
    C# 逻辑位运符及运算原理 按位操作二进制
    0913 理论知识,项目
    使用tailwind+next.js写一个github页面进行学习
    3、ARM寄存器组织
    9.java项目-尚医通(9)
    MongoDB(一):CentOS7离线安装MongoDB单机版与简单使用
    HTB-Tier2- Unified
    提取项目依赖包的licenses
    【计算机网络期末复习】选择题①1~50
    Stata 数据处理系列:日期与时间数据
  • 原文地址:https://blog.csdn.net/qq_36131739/article/details/137904027