Qt使用QAbstractTableModel实现表格高频更新性能低下如何优化
Qt QAbstractTableModel 高频更新性能优化方案
你当前代码的性能瓶颈主要来自全量更新信号触发、数据接口冗余开销,以及视图未开启性能优化配置,可按照以下优先级优化:
- 修复数据接口的冗余开销
你当前注释了从m_values读取缓存数据的逻辑,每次data()函数被视图调用时都会实时生成随机数、构造QString对象,1500个单元格每次更新就要执行1500次随机数生成+字符串构造操作,开销极高。
调整逻辑为:定时器触发时先批量更新m_values数组里的所有数值,再发送更新信号;data()函数仅从m_values读取数据,直接返回数值类型的QVariant即可,无需手动转QString,视图会自动完成格式化展示,代码示例:// 调整后的data函数 QVariant TableModel::data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole){ return m_values[index.row()][index.column()]; } return QVariant(); } // 调整后的update逻辑,先更新数据再发信号 void TableModel::update() { for(int i = 0 ; i < ROWS; ++i){ for(int j = 0; j < COLS; ++j){ m_values[i][j] = QRandomGenerator::global()->generate(); } } emit dataChanged(index(0,0), index(ROWS-1,COLS-1)); } - 避免无效的全量更新信号触发
如果你不是每次都需要更新所有单元格,仅针对发生数值变化的单元格区域发送dataChanged信号即可,不需要每次都通知全表更新,大幅减少视图的重绘请求量。 - 开启QTableView的性能优化配置
新增以下配置项,减少视图不必要的布局、计算开销:// 告知视图所有行高一致,无需逐行计算尺寸 ui->tableView->setUniformRowHeights(true); // 关闭单元格编辑功能(如果不需要编辑的话) ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 固定列宽行高(如果不需要用户调整表头尺寸的话) ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); // 标记视口内容为静态,减少重绘区域计算开销 ui->tableView->viewport()->setAttribute(Qt::WA_StaticContents); - 提升定时器精度(可选)
Windows平台默认QTimer精度为15ms,和你设置的16ms间隔接近,容易出现触发延迟,可设置为高精度定时器:m_timer.setTimerType(Qt::PreciseTimer); m_timer.start(16); - 测试Release模式性能
Qt Debug模式会开启大量断言、边界检查逻辑,性能比Release模式低3~10倍,优化完成后请在Release模式下验证性能,44x36的表格跑满60帧不会有CPU占用过高的问题。
以上优化全部保留了Qt原生的排序、列交互能力,不需要自定义自绘控件。
内容的提问来源于stack exchange,提问作者Veaceslav
相关产品推荐
相关产品推荐

