Performance QTableWidget ResiZeroWSToContent非常慢
我有一个QTableWidget,包含超过200000行和8列。 这些列具有固定的大小。 行的大小是可变的。 将项目添加到表中很快(几秒钟) 然后调用resizerWSToContents()几乎需要60/120秒!我看到这个调用是单线程的!(只有一个核心工作)。 我可以强制多线程吗? 如何加快行大小调整 谢谢,,Performance QTableWidget ResiZeroWSToContent非常慢,performance,qt,resize,row,qtablewidget,Performance,Qt,Resize,Row,Qtablewidget,我有一个QTableWidget,包含超过200000行和8列。 这些列具有固定的大小。 行的大小是可变的。 将项目添加到表中很快(几秒钟) 然后调用resizerWSToContents()几乎需要60/120秒!我看到这个调用是单线程的!(只有一个核心工作)。 我可以强制多线程吗? 如何加快行大小调整 谢谢,, Salvo调整大小必须重新计算、调整每一行的高度。我不建议在一个QTableWidget中有这么多行。对于这个长长的列表,我会选择分页技术或一些动态加载功能。您可以尝试的一件事是使用
Salvo调整大小必须重新计算、调整每一行的高度。我不建议在一个QTableWidget中有这么多行。对于这个长长的列表,我会选择分页技术或一些动态加载功能。您可以尝试的一件事是使用(注意:
行
而不是行
)逐行更新QTableWidget
,更新与队列中的其他事件交错。总的来说,这个过程仍然需要相同的时间,但是您的GUI在这个过程中仍然保持响应
首先,利用这样一个事实,即当事件队列变空时,超时为零的将发出超时信号。所以像这样的代码
QTimer::singleShot(0, &my_callback);
将有效地等待事件队列为空,然后调用my\u callback
。如果my_callback
调用同一行代码,那么您就拥有了一个在下一空闲期间自动调用自身的函数
现在编写函数
void resize_row (QTableWidget *view, int row, int count = 1)
{
/*
* Resize rows `row' -> `row + count - 1'
*/
for (int todo = count; row < view->rowCount() && todo--; ++row) {
view->resizeRowToContents(row);
}
/*
* If there are still rows remaining then reschedule.
*/
if (row < view->rowCount()) {
QTimer::singleShot(0, [=](){ resize_row(view, row, count); });
}
}
与
QTimer::singleShot(0, [table_widget, row = 0](){ resize_row(table_widget, row, 10); });
在我所做的基本测试中似乎运行良好。如果您想要更高的速度,请使用QAbstractTableModel而不是QTableWidget,并覆盖所需的函数。这是一个简单而好的例子:
QTimer::singleShot(0, [table_widget, row = 0](){ resize_row(table_widget, row, 10); });