2014-11-02 85 views
0

我有一个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))); 
} 

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

回答

1

你应该用特殊ViewMode

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

但它会告诉你只有图标(而不是整个图像),所以我觉得你应该创建例如QStandardItemModel(因为QFileSystemModel不是很适合),并设置像素图与Qt::DecorationRole一起使用此模型,但将此图像缩放至较小尺寸。正如您了解目录中是否有许多图像,此过程可能会很长。有特殊的过滤器

QStringList QDir::entryList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const 

正如你所看到的,你应该每天(每on_treeView_clicked)时得到的目录图像的新的列表,你可以做到这一点。当你有文件列表时,在循环中你可以创建像素图,缩放并设置为模型。

默认QListView::IconMode提供自由移动。如果你想避免这种情况,你应该使用:

ui->listView->setMovement(QListView::Static); 
+0

谢谢,但我希望看到更多细节,因为该主题仍不清楚。 – 2014-11-02 20:22:21

+0

对于这种[[link](http://qt-project.org/forums/viewthread/27412)]中的这种方式,您有何看法? – 2014-11-02 20:46:44

+0

@LionKing在你的代码中你使用视图和模型,所以我的解决方案也可以查看。反正在这个链接中,人们也推荐使用listview和icon模式。 – Chernobyl 2014-11-02 20:52:50

0

取决于你是什么后有更好的方法去了解它,我想,但这里是基于我的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