C++ Qt图像列表

C++ Qt图像列表,c++,qt,qt5,qt5.8,C++,Qt,Qt5,Qt5.8,我正在寻找一种高效的方法来查看Qt5.8中JPEG的缩略图列表(可能有几千个) 我目前的方法是使用QListWidget(参见下文和)。事实证明,这是太慢了,因为它需要永远组装,即使是一些图像 我正在寻找: 了解我目前的方法为何如此缓慢 为了获得更有效的方法,仍然需要尽可能多地依赖Qt的特性,从而只需要很少的代码 当前方法: ui->listWidget->setViewMode (QListWidget::IconMode); ui->listWidget->setI

我正在寻找一种高效的方法来查看Qt5.8中JPEG的缩略图列表(可能有几千个)

我目前的方法是使用
QListWidget
(参见下文和)。事实证明,这是太慢了,因为它需要永远组装,即使是一些图像

我正在寻找:

  • 了解我目前的方法为何如此缓慢
  • 为了获得更有效的方法,仍然需要尽可能多地依赖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));
    

    (因此,
    文件
    属于
    std::vector
    类型)

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

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


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

    对于G.M.的回答,我没有太多的评论,因此我补充了以下内容:

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

  • 访问图像文件及其解码可能会占用大量时间。正如通用汽车公司所建议的那样,有一些缓冲/预处理或延迟是很好的
  • 我相信,图像是按“原样”(高分辨率)加载的,但在QIcon内部的缩略图视图中,图像的分辨率被调整到很小。这可以通过使用类进行图像读取来优化,特别是它的方法
    setScaledSize(const QSize&size)
  • 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));
        }
    };