2014-11-02 6 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, но масштабируйте эти изображения до меньшего размера. Как вы понимаете, есть ли много изображений в каталоге, этот процесс может быть долгим.

Как вы можете видеть, вы должны каждый раз (каждый on_treeView_clicked) получить новый список изображений в каталоге, Вы можете сделать это с помощью:

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

специальных фильтров. Когда у вас есть список файлов, в цикле вы можете создавать pixmaps, масштабировать его и устанавливать в модель.

По умолчанию QListView::IconMode обеспечивает свободное передвижение. Если вы хотите избежать этого, вы должны использовать:

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

Спасибо, но я надеялся увидеть больше деталей, потому что тема все еще неясна. –

+0

Каково ваше мнение по этому пути, которое в этой [[link] (http://qt-project.org/forums/viewthread/27412)]? –

+0

@ LionKing в вашем коде, который вы работаете с представлением и моделями, поэтому мое решение также доступно для просмотра. В любом случае в этой ссылке люди также рекомендуют использовать режим списка и значков. – Chernobyl

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

Смежные вопросы