我有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)));
}
不幸的是,我不知道将图像视图从图标更改为缩略图的方式是什么。
答案 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)