Qt - 没有UI冻结的大量小部件显示

时间:2016-11-09 16:01:51

标签: c++ multithreading qt user-interface

我希望在不阻止UI的情况下尽快显示大量小部件(~1万)。小部件是简单的QPixmap,包含从磁盘加载并存储在QVector内的图像。

以下是有问题的代码:

for (QPixmap image : images) {
    QLabel* label = new QLabel();
    label->setPixmap(image);
    flowLayout->addWidget(label);
}

在超过5000万张图像的某个时刻,UI开始冻结,但随后又回来了。

我有一个使用QCoreApplication::processEvents()的可能解决方案,但这使得该过程非常缓慢(虽然视觉上优雅)。

int k = 0;
for (QPixmap image : images) {
    ++k;
    QLabel* label = new QLabel();
    label->setPixmap(image);
    flowLayout->addWidget(label);
    if (k >= 100) {
        QCoreApplication::processEvents();
        k = 0;
    }
}

使用 k 我正在尝试校准UI线程的刷新率。

所以我的问题是什么是最好的方法还是有良好的中间立场?一个显示多个小部件而不会压倒主线程的小部件。

旁注:我正在做一种涉及大量图像显示的基准测试。 JavaFX 方法几乎立即将图像从内存中吐出到UI,但我发现加载和显示图像时速度稍慢。我的意思是,C ++方法在大约5000个图像的每个方面都能更快地运行,但在此之后就会出现问题。

0 个答案:

没有答案