Qt 图像列表



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

我目前的方法是使用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));

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

一个快速的解决方案可能是创建一个从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));
    }
};

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

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

我对通用汽车的答案发表评论的次数很少,所以这是我的补充:

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

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

相关内容

  • 没有找到相关文章