QTableWidget resizeRowsToContents非常慢

问题描述 投票:0回答:3

我有一个QTableWidget,其中包含200.000行和8列。列的大小固定。行的大小可变。将项目添加到表很快(几秒钟)。

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

谢谢,齐声

performance qt resize row qtablewidget
3个回答
0
投票

调整大小必须重新计算,每一行要调整。我不建议在单个QTableWidget中包含这么多的行。为此,我会寻求分页技术或一些动态加载功能。


0
投票

您可能尝试做的一件事是使用QTableWidget(注意:QTableWidget::resizeRowToContents而不是QTableWidget::resizeRowToContents)逐行更新Row,并且将更新与队列中的其他事件交错。总体而言,该过程仍将花费相同的时间,但是您的GUI在此过程中将保持响应状态。

首先,利用以下事实:事件队列为空时,具有零超时的Rows将发出其超时信号。所以代码,如...

QTimer

将有效地等待,直到事件队列为空,然后调用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); });
    }
}

with ...

view->resizeRowToContents(...)

似乎在我完成的基本测试中可以正常工作。


0
投票

如果要提高速度,请使用QAbstractTableModel而不是QTableWidget并覆盖所需的函数。这是一个简单而良好的示例:table_widget->resizeRowsToContents();

© www.soinside.com 2019 - 2024. All rights reserved.