QTableView获取可见的行数

news/2024/9/24 13:14:33/

场景

      当我们需要实时刷新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/news/1435041.html

相关文章

Syncovery for Mac:高效文件备份和同步工具

Syncovery for Mac是一款专为Mac用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;深受用户好评。 Syncovery for Mac v10.14.2激活版下载 该软件具备强大的备份功能&#xff0c;支持多种备份方案和数据格式&#xff0c;用户可以根据需求轻松…

简单工厂、工厂方法、抽象工厂对比

简单工厂、工厂方法和抽象工厂是三种常见的工厂设计模式&#xff0c;它们在软件设计中各有其独特的应用场景和优缺点。因为三种设计模式都属于工厂模式&#xff0c;在实际应用中可能存在误用的场景&#xff0c;这里对其做下对比&#xff0c;以便更好的理解这三种设计模式。 简…

【期末复习向】智能信息系统前4章梳理

第四章 不确定性推理 [了解即可]4.1 不确定性概述 不确定性推理概念 所谓推理&#xff0c;就是从已知事实出发&#xff0c;运用相关的知识&#xff08;或规则&#xff09;逐步推出结论或者证明某个假设成立或不成立的思维过程。 不确定性方法分类 1.模型方法 a&#xff0…

5分钟搞懂词向量生成技术:Word2Vec

大家好啊&#xff0c;我是董董灿。 今天我们来简单聊一个在自然语言处理&#xff08;NLP&#xff09;中非常有用的技术——Word2Vec。 之前曾经写过一些关于文本处理的基础知识&#xff0c;包括判断两个文本是否相似&#xff0c;可以使用余弦相似度&#xff0c;但在此之前&am…

【Redis(4)】Redis主从复制模式配置示例

Redis的三种高可用方案对比参考上一篇博客&#xff1a;深入理解Redis三种高可用方案&#xff0c;以做出明智的选择&#xff0c;下面要探讨的是三种方案其中的一种。 在构建高性能的缓存系统时&#xff0c;Redis以其卓越的性能和简单性成为了首选。本文将探讨Redis主从复制的工…

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在理解和生成人类语言方面取得了显著的飞跃&#xff0c;这些进步不仅推动了语言学和计算机编程的发展&#xff0c;还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM&#xff0c;它们通过吸收海量文本…

B2弹幕插件优化版WordPress插件

源码下载&#xff1a;B2弹幕插件.zip 这是b2独有的站点信息弹幕插件&#xff0c;专门用来在首页显示站点动态的一款个性化 WordPress插件。喜欢的可以下载回去进行二次开发&#xff0c;还是蛮不错的 基于wordpress 7B2主题开发的一款弹幕插件/气泡插件 功能一览 插件安装&a…

AI-数学-高中-43常见函数的导数

原作者视频&#xff1a;【导数】【一数辞典】2常见函数的导数_哔哩哔哩_bilibili