I believe that a simple and correct approach is using QtConcurrent as the following:
Note: If you are using Qt 5 you will need to add QT += concurrent to the .pro file.
Header:
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include <QtConcurrent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:
    void UpdateItem(int, QImage);
private slots:
    void on_treeView_clicked(const QModelIndex &);
    void List(QFileInfoList filesList, QSize size);
    void setThumbs(int index, QImage img);
private:
    Ui::MainWindow *ui;
    QFileSystemModel *model;
    QStandardItemModel *filesmodel;
    QFuture<void> thread;
    bool running;
};
CPP file:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QThreadPool::globalInstance()->setMaxThreadCount(1);
    model = new QFileSystemModel(this);
    model->setRootPath("\\");
    filesmodel = new QStandardItemModel(this);
    ui->treeView->setModel(model);
    ui->listView->setModel(filesmodel);
    connect(this, SIGNAL(UpdateItem(int,QImage)), SLOT(setThumbs(int,QImage)));
    ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    running = false;
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_treeView_clicked(const QModelIndex&)
{
    filesmodel->clear();
    running = false;
    thread.waitForFinished();
    QDir dir(model->filePath(ui->treeView->currentIndex()));
    QFileInfoList filesList = dir.entryInfoList(QStringList() << "*.jpg" << "*.jpeg" << "*.tif" << "*.png" << "*.gif" << "*.bmp", QDir::Files);
    int filesCount = filesList.size();
    QPixmap placeholder = QPixmap(ui->listView->iconSize());
    placeholder.fill(Qt::gray);
    for (int i = 0; i < filesCount; i++)
        filesmodel->setItem(i, new QStandardItem(QIcon(placeholder), filesList[i].baseName()));
    running = true;
    thread = QtConcurrent::run(this, &MainWindow::List, filesList, ui->listView->iconSize());
}
void MainWindow::List(QFileInfoList filesList, QSize size)
{
    int filesCount = filesList.size();
    for (int i = 0; running && i < filesCount; i++)
    {
        QImage originalImage(filesList[i].filePath());
        if (!originalImage.isNull())
        {
            QImage scaledImage = originalImage.scaled(size);
            if (!running) return;
            emit UpdateItem(i, scaledImage);
        }
    }
}
void MainWindow::setThumbs(int index, QImage img)
{
    QIcon icon = QIcon(QPixmap::fromImage(img));
    QStandardItem *item = filesmodel->item(index);
    filesmodel->setItem(index, new QStandardItem(icon, item->text()));
}