Вы можете попробовать обновить QTableWidget
строку за строкой, используя QTableWidget::resizeRowToContents
< /a>(Примечание: Row
, а не Rows
) с обновлениями, чередующимися с другими событиями в очереди. В целом процесс займет столько же времени, но ваш графический интерфейс останется отзывчивым во время процесса.
Во-первых, воспользуйтесь тем фактом, что 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); });
}
}
Это вызовет view->resizeRowToContents(...)
для всех строк в диапазоне [строка, строка + количество). Если индекс строки все еще меньше, чем количество строк, он запланирует себя на следующий период простоя с обновленными параметрами.
Теперь замени...
table_widget->resizeRowsToContents();
с участием...
QTimer::singleShot(0, [table_widget, row = 0](){ resize_row(table_widget, row, 10); });
Кажется, работает нормально в основных тестах, которые я сделал.
23.02.2020