【问题标题】:Qt list of imagesQt 图像列表
【发布时间】:2017-05-20 15:53:04
【问题描述】:

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

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

我正在寻找:

  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> 类型)

【问题讨论】:

    标签: c++ qt qt5 qt5.8


    【解决方案1】:

    一个快速的解决方案可能是创建一个从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 执行缩略图生成和缓存。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-16
        • 1970-01-01
        • 2020-09-18
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        相关资源
        最近更新 更多