QTableView获取可见的行数

ops/2024/9/24 11:20:24/

场景

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

代码

方法1

QVector<int> getVisibleRows(QTableView* tableView)
{QVector<int> visibleRows;int numRows = tableView->model()->rowCount();//可见的第一行int firstVisibleRow = tableView->rowAt(0);if (firstVisibleRow != -1){//可见的最后一行int lastVisibleRow = tableView->rowAt(tableView->viewport()->height() - 1);if (lastVisibleRow == -1){lastVisibleRow = numRows - 1;}//遍历所有可见行for (int row = firstVisibleRow; row <= lastVisibleRow; ++row) {visibleRows.append(row);}}return visibleRows;
}

方法2

QVector<int> getVisibleRows2(QTableView* tableView) 
{QVector<int> visibleRows;QAbstractItemModel* model = tableView->model();QRect viewportRect = tableView->viewport()->rect();int numRows = model->rowCount();for (int row = 0; row < numRows; ++row){QModelIndex index = model->index(row, 0);QRect rowRect = tableView->visualRect(index);if (rowRect.isValid() && viewportRect.intersects(rowRect)) {visibleRows.append(row);}}return visibleRows;
}

对比

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

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建一个QTableView并设置数据模型QTableView* tableView = new QTableView;QStandardItemModel model(10000, 2);tableView->setModel(&model);QPushButton* btnPrint = new QPushButton("GetRows");QObject::connect(btnPrint, &QPushButton::clicked, [tableView]() {// 获取可见行的索引QElapsedTimer timer;timer.start();//第一种方式QVector<int> visibleRows = getVisibleRows(tableView);//第二种方式QVector<int> visibleRows = getVisibleRows2(tableView);qint64 elapsed = timer.elapsed(); // 获取经过的毫秒数qDebug() << "Time elapsed:" << elapsed << "milliseconds";qDebug() << "Visible Rows:";for (int row : visibleRows)qDebug() << row;});QVBoxLayout* mainLayout = new QVBoxLayout;mainLayout->addWidget(tableView);mainLayout->addWidget(btnPrint);QWidget* mainWin = new QWidget;mainWin->setLayout(mainLayout);mainWin->show();return a.exec();
}

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

 方法1:

 方法2


http://www.ppmy.cn/ops/16147.html

相关文章

java生成数据库数据到excel当做下拉选择,copy就完事~

背景&#xff1a;由于需要下载模板&#xff0c;模板包含下拉选择框&#xff0c;但是下拉选择框不想手写&#xff0c;并且需要从数据库读取&#xff0c;由于直接设置excel会有单元格最大255个字符长度限制&#xff0c;所以用到以下部分代码。 思路&#xff1a;由于数据模板在sh…

xgp怎么取消续费 手把手介绍微软商店xgp关闭自动续费教程

Xbox是美国微软公司创建的电子游戏品牌&#xff0c;随2001年11月第一代Xbox游戏机发布而首次推出。其产品和服务包括家用游戏机、游戏制作与发行、线上游戏服务和内容订阅服务。Xbox已发售的家用游戏机有Xbox、Xbox360、Xbox One、Xbox One S、Xbox One X、Xbox Series X、Xbox…

vue3 -- 项目使用自定义字体font-family

在Vue 3项目中使用自定义字体(font-family)的方法与在普通的HTML/CSS项目中类似。可以按照以下步骤进行操作: 引入字体文件: 首先,确保你的字体文件(通常是.woff、.woff2、.ttf等格式)位于项目中的某个目录下,比如src/assets/font/。 在全局样式中定义字体: 在你的全局…

使用Krukal算法解决图的最小生成树问题

Kruskal 算法 Kruskal算法是一种用于寻找连通图中最小生成树的算法。最小生成树是一个包含图中所有顶点的树&#xff0c;且边权重之和最小。Kruskal算法是一种贪心算法&#xff0c;它的基本思想是&#xff1a;每次选择边权重最小的边来扩展树&#xff0c;直到树包含所有的顶点…

练习题(2024/4/25)

1监控二叉树 困难 相关标签 相关企业 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&…

记录如何用php将敏感文字内容替换为星号的方法

在PHP中&#xff0c;将敏感文字用星号替换通常涉及到字符串的搜索和替换操作。你可以使用PHP的内置函数str_replace()来实现这个功能。下面是一个基本的示例&#xff0c;展示如何将特定的敏感词替换为星号&#xff1a; <?php // 要检查的原始文本 $text "这个文本包…

商标申请注册交费就一定会下注册证?

近日遇到一个网友说普推知产老杨说&#xff0c;他以为商标交钱就一定会下商标注册证&#xff0c;这个不管找哪家也做不到的。商标申请注册时要给商标局交费用&#xff0c;交完费用商标才有商标的形式审查&#xff0c;通过后下受理书&#xff0c;才有后面商标实质审查&#xff0…

数字信号处理(MATLAB入门例子)

&#xff08;代码主要来源于这本书&#xff09; 1.用MATLAB产生32个正弦波样本&#xff0c;A2&#xff0c;f1000Hz&#xff0c;以及fs8000Hz % % Example 2.1 Sinewave generator % This example generate 32 sine sample, % plot it and save in sine.dat file% For the boo…