• 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

  • 相关阅读:
    【数据结构与算法分析】0基础带你学数据结构与算法分析08--二叉查找树 (BST)
    三、Ocelot请求聚合与负载均衡
    fseek函数的应用
    git工具的安装及使用
    2024年6月四六级考试复盘
    Gateway新一代网关
    Docker安装MongoDB和Redis
    【pm4py】process mining 读取log生成model/net/tree
    谈一谈SQLite、MySQL、PostgreSQL三大数据库
    顺序表专题
  • 原文地址:https://blog.csdn.net/qq_36131739/article/details/137904027