QTableView获取可见的行数

场景

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

代码

方法1

cpp 复制代码
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

cpp 复制代码
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函数,简单测试一下哪种方法更有效率:

cpp 复制代码
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

相关推荐
娇娇yyyyyy25 分钟前
Qt编程(3): 信号和槽函数
开发语言·数据库·qt
wwww.wwww29 分钟前
qt程序执行时报错:无法定位程序输入点,但是通过IDE的run又可以正常的运行。
开发语言·ide·qt
森G2 小时前
11、交叉编译Opencv----------Opencv移植Arm
qt
乌鸦乌鸦你的小虎牙3 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
70asunflower4 小时前
CUDA编程指南基础知识点总结(5)
c++·人工智能·cuda
森G5 小时前
8、交叉编译x264----------Opencv移植Arm
qt
笨笨马甲5 小时前
Qt QSS使用指南
开发语言·qt
mjhcsp7 小时前
C++剪枝解析
c++·剪枝
wregjru7 小时前
【网络】5.HTTP 协议详解与实现
c++
Ralph_Y7 小时前
正则表达式
开发语言·c++·正则表达式