Qt 图像列表

Qt list of images

我正在寻找一种有效的方法来查看 Qt 5.8 中 jpeg 的缩略图列表(可能有数千个)。

我目前的做法是使用QListWidget(见下文,以及this question)。事实证明这太慢了,因为 assemble 需要很长时间,即使是一些图像。

我在找:

  1. 理解为什么我目前的方法这么慢。
  2. 为了更有效的方法,它仍然只需要尽可能少的代码,尽可能依赖 Qt 的功能。

当前方法:

ui->listWidget->setViewMode  (QListWidget::IconMode);
ui->listWidget->setIconSize  (QSize(200,200)       );
ui->listWidget->setResizeMode(QListWidget::Adjust  );

for ( auto &i : files ) 
  ui->listWidget->addItem(new QListWidgetItem(QIcon(i),i));

(其中 files 属于 std::vector<QString> 类型)

一个快速的解决方案可能是创建一个简单的 class 继承自 QListWidgetItem 并按需修复缩略图。您可以尝试类似(注意:未经测试)...

class thumbnail_item: public QListWidgetItem {
  using super = QListWidgetItem;
public:
  explicit thumbnail_item (const QString &filename)
    : super(filename)
    {}
  virtual QVariant data (int role) const override
    {
      if (role == Qt::DecorationRole) {
        QIcon i = super::icon();
        if (i.isNull()) {

          /*
           * The existing thumbnail (if any) is empty so create one
           * from the file name and use it -- remembering to call
           * setIcon so we don't need to go through all this again
           * next time.
           */
          i = QIcon(data(Qt::DisplayRole));
          setIcon(i);
        }
        return(i);
      }
      return(super::data(role));
    }
};

您仍然需要循环为每个文件创建一个项目,但至少它推迟了缩略图的构建。

更优雅的解决方案可能涉及使用完全分离的模型和视图对象,并通过自定义 proxy model 执行缩略图生成和缓存。

我对 G.M 的回答发表评论的人很少,所以这里是我的补充:

由于两个原因,初始化可能需要很长时间:

  1. 访问图像文件及其解码可能会占用大量时间。很高兴有一些 buffering/precaching 或延迟,如 G.M。建议。
  2. 我相信,图像已加载 "as is"(高分辨率),但在 QIcon 内调整为缩略图视图的小分辨率。这可以通过使用 QImageReader class 进行图像读取来优化,特别是它的方法 setScaledSize(const QSize &size).