您可能会尝试的一件事是使用QTableWidget::resizeRowToContents(注意:Row 而不是Rows)逐行更新QTableWidget,更新与队列中的其他事件交错。总体而言,该过程仍将花费相同的时间,但您的 GUI 将在此过程中保持响应。
首先,利用具有零超时的QTimer 将在事件队列变空时发出其超时信号这一事实。所以代码如...
QTimer::singleShot(0, &my_callback);
将有效地等待事件队列为空,然后调用my_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); });
}
}
这将在 [row, row + count) 范围内的所有行上调用 view->resizeRowToContents(...)。如果行索引仍然小于行计数,它将使用更新的参数为下一个空闲期自行安排。
现在,替换...
table_widget->resizeRowsToContents();
与...
QTimer::singleShot(0, [table_widget, row = 0](){ resize_row(table_widget, row, 10); });
在我完成的基本测试中似乎运行良好。