选择多行时QTableView变得很慢

Posted

技术标签:

【中文标题】选择多行时QTableView变得很慢【英文标题】:QTableView becomes very slow when multiple rows are selected 【发布时间】:2013-04-28 10:22:11 【问题描述】:

我有一个大约 1000 行的模型,其中一列每秒都在变化。 我在真实模型和表格视图之间放置了一个自定义排序/过滤模型,以便在行更改后立即进行过滤。

现在问题来了: 如果在表格视图中没有选择任何内容,则一切正常;但是当我选择了一些行时,表格变得滞后。选择的行越多,滞后越多。

为什么?希望有人能给我提示,提前谢谢!

【问题讨论】:

【参考方案1】:

抱歉,QTableView 中有很多潜在的性能下降的地方。

查明减速的最简单方法是分析应用程序。如果您有电话 吃cpu,推断是什么原因并修复它要简单得多。

此外,您对自定义排序/过滤代理的设计也没有多说。如果您使用 QSortFilterProxyModel,请注意它不能很好地扩展。

【讨论】:

【参考方案2】:

在为启用选择的表格绘制(顶部)标题时,函数:

bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent) const

被调用(每列两次 - 但可能因选择模式而异)。 此函数遍历所有选定的行(“qitemselectionmodel.cpp”Qt 4.8.5 中的第 1333 行)。 所以如果选择了很多行,每个标题列的绘制会变得非常慢。

左侧标题与列/行切换相同。

被调用的函数大多不是虚拟的——所以如果不完全绘制自己的标题或隐藏标题,似乎没有办法避免这种情况。

也许 Qt 应该对此进行优化。

【讨论】:

以上是关于选择多行时QTableView变得很慢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 selectionModel 在 QTableView 中选择多行

带有 qTableview 的 Pandas 模型的慢 PyQt5 QAbstractTableModel

如何在 Pyqt4 中设置 QTableView 标头名称

qt 中Qtable widget中如何加一个表

QT - QTableView removeRow() 崩溃

如何在pyqt4的右侧对齐qtableview行?