我正在寻找一种有效的方法来查看Qt 5.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));
(其中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 个原因,初始化可能需要很长时间:
- 访问图像文件及其解码可能会占用大量时间。正如 GM 建议的那样,有一些缓冲/预缓存或延迟是很好的。
- 我相信,图像是"按原样"加载的(高分辨率(,但调整为微小的分辨率,以便在 QIcon 中查看缩略图。这可以通过使用QImageReader类进行图像读取来优化,特别是它的方法
setScaledSize(const QSize &size)
。