Qt список изображений
Я ищу эффективный способ просмотра списка миниатюр jpeg в Qt 5.8 (возможно, несколько тысяч).
Мой текущий подход заключается в использовании 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>
тип)
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));
}
};
Вам все еще нужен цикл для создания элемента для каждого файла, но, по крайней мере, он задерживает создание миниатюр.
Более элегантное решение, вероятно, будет включать использование полностью разделенной модели и просмотр объектов с пользовательской прокси-моделью, выполняющей создание миниатюр и кэширование.
У меня низкая репутация, чтобы комментировать ответ GM, поэтому вот мое дополнение:
Инициализация может занять много времени по двум причинам:
- Доступ к файлам изображений и их декодирование могут занимать значительное время. Приятно иметь некоторую буферизацию / предварительное кэширование или отсрочку, как предложил GM
- Я полагаю, что изображения загружаются "как есть" (в высоком разрешении), но уменьшаются до крошечного разрешения для просмотра миниатюр внутри QIcon. Это можно оптимизировать, используя класс QImageReader для чтения изображений, особенно его метод
setScaledSize(const QSize &size)
,