Performance QTableWidget ResiZeroWSToContent非常慢

Performance QTableWidget ResiZeroWSToContent非常慢,performance,qt,resize,row,qtablewidget,Performance,Qt,Resize,Row,Qtablewidget,我有一个QTableWidget,包含超过200000行和8列。 这些列具有固定的大小。 行的大小是可变的。 将项目添加到表中很快(几秒钟) 然后调用resizerWSToContents()几乎需要60/120秒!我看到这个调用是单线程的!(只有一个核心工作)。 我可以强制多线程吗? 如何加快行大小调整 谢谢,, Salvo调整大小必须重新计算、调整每一行的高度。我不建议在一个QTableWidget中有这么多行。对于这个长长的列表,我会选择分页技术或一些动态加载功能。您可以尝试的一件事是使用

我有一个QTableWidget,包含超过200000行和8列。 这些列具有固定的大小。 行的大小是可变的。 将项目添加到表中很快(几秒钟)

然后调用resizerWSToContents()几乎需要60/120秒!我看到这个调用是单线程的!(只有一个核心工作)。 我可以强制多线程吗? 如何加快行大小调整

谢谢,,
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); });