2014-11-02 110 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