如何将图像显示为缩略图

时间:2014-11-02 20:04:59

标签: c++ image qt thumbnails qt5

我有QTreeView来显示硬盘和目录。我还有一个QListView来显示图像文件,如下所示:

但我想以缩略图的形式显示图像,如下所示:

我的代码:

mainWidget::mainWidget(QWidget *parent) : QWidget(parent), ui(new Ui::mainWidget){
    ui->setupUi(this);
    dirsModel = new QFileSystemModel;
    filesModel = new QFileSystemModel;
    dirsModel->setRootPath("");
    ui->treeView->setModel(dirsModel);
    ui->listView->setModel(filesModel);
    dirsModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
    filesModel->setFilter(QDir::Files);
    ui->treeView->hideColumn(1);
    ui->treeView->hideColumn(2);
    ui->treeView->hideColumn(3);
    ui->treeView->header()->hide();
}

void mainWidget::on_treeView_clicked(const QModelIndex &index){
    ui->listView->setRootIndex(filesModel->setRootPath(dirsModel->filePath(index)));
}

不幸的是,我不知道将图像视图从图标更改为缩略图的方式是什么。

2 个答案:

答案 0 :(得分:3)

您应该使用特殊ViewMode

 ui->listView->setViewMode(QListView::IconMode);

但是它只显示图标(不是整个图像),所以我认为你应该创建例如QStandardItemModel(因为QFileSystemModel不是很合适)并使用{{将pixmap设置为此模型1}},但将此图像缩放为较小的尺寸。如您所知,如果目录中有很多图像,则此过程可能很长。

正如您所看到的,您应该每次(每Qt::DecorationRole个)获取目录中的新图像列表,您可以执行以下操作:

on_treeView_clicked

使用特殊过滤器。当你有文件列表时,你可以在循环中创建像素图,缩放它并设置为模型。

默认情况下QStringList QDir::entryList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const 提供自由移动。如果你想避免这种情况,你应该使用:

QListView::IconMode

答案 1 :(得分:2)

根据你的想法,我认为有更好的方法,但这里有一个基于我的python项目的例子:

您可以做的是为QFileIconProvider创建子类:

ICON_SIZE = QSize(64,64)
accepted_types = (".jpg",".tiff",".png",".exr",".psd")

# this depends on the plugins you have installed,
# PSD and EXR requires external ones).

class IconProvider(QFileIconProvider):

    def __init__(self) -> None:
        super().__init__()

    def icon(self, type: 'QFileIconProvider.IconType'):

        fn = type.filePath()

        if fn.endswith(accepted_types):
            a = QPixmap(ICON_SIZE)
            a.load(fn)
            return QIcon(a)
        else:
            return super().icon(type)

然后在您使用的模型上:

self.fileSystemModel.setIconProvider(IconProvider)

TreeView上的示例: Custom Icon Provider Preview