2

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

我目前的方法是使用 a QListWidget(见下文和这个问题)。事实证明这太慢了,因为它需要很长时间才能组装,即使是几张图像。

我在看:

  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));

(其中filesstd::vector<QString>类型)

4

2 回答 2

2

一个快速的解决方案可能是创建一个简单的类,该类继承自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));
    }
};

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

一个更优雅的解决方案可能涉及使用完全分离的模型和视图对象以及执行缩略图生成和缓存的自定义代理模型。

于 2017-05-20T16:20:37.673 回答
1

我对 GM 的回答的评价很低,所以这是我的补充:

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

  1. 访问图像文件及其解码可能会占用大量时间。正如 GM 建议的那样,有一些缓冲/预缓存或延迟是很好的。
  2. 我相信,图像是“按原样”加载的(以高分辨率),但在 QIcon 内为缩略图视图调整为微小分辨率。这可以通过使用QImageReader类进行图像读取来优化,特别是它的方法setScaledSize(const QSize &size)
于 2017-05-22T15:29:10.247 回答