Перезаписать данные и setData в QFileSystemModel Qt - PullRequest
0 голосов
/ 21 февраля 2010

Что я пытаюсь сделать: Перезаписать setData и данные QFileSystemModel для реализации кэширования изображений в показанном каталоге.

Я использую QListView для тестирования.

Вот соответствующий код:

Мой класс с QFileSystemModel в качестве родителя:

.h-файл:

#ifndef QPICSINFILESYSTEMMODEL_H
#define QPICSINFILESYSTEMMODEL_H

#include <QFileSystemModel>
#include <QCache>
#include <QDebug>

/* This Model holds all Picturefiles with a cached QPixmap of
 * them.
 */

class PicsInFileSystemModel : public QFileSystemModel
{
public:
    PicsInFileSystemModel();
    QVariant data (const QModelIndex & index, int role);
private:
    QCache<qint64,QPixmap> *cache; //Cache for the pictures

};

#endif // QPICSINFILESYSTEMMODEL_

.cpp-файл:

#include "PicsInFileSystemModel.h"

PicsInFileSystemModel::PicsInFileSystemModel()
{
    QStringList myFilter;
    this->setFilter(QDir::Files | QDir::AllDirs);
    this->setRootPath(QDir::rootPath());//QDir::homePath());
    myFilter << "jpeg" << "jpg" << "png";
    //this->setNameFilters(myFilter);
}

/* Reimplement data to send the pictures to the cache */
QVariant PicsInFileSystemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) {
    qDebug() << "index: " << index << "role: " << role;

    return ((QFileSystemModel)this).data(index,role);
}

Как я называю объект:

pics = new PicsInFileSystemModel;
form->listViewPictures->setModel(pics);
form->listViewPictures->setRootIndex(pics->index(
        "mypath"));

Итак, вот вопрос: по моему мнению, я должен увидеть много отладочных выходов, когда View получит доступ к модели. Но там ничего нет. Кто-нибудь знает, что я делаю не так?

Спасибо!

EDIT: Ответы работают. Я также должен был изменить это

return ((QFileSystemModel)this).data(index,role); 

в

QFileSystemModel::data(index,role))

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

Ваша data функция никогда не вызывается, потому что она не соответствует исходному определению . Вы не повторно реализуете data, вы предоставили неконстантную версию.

2 голосов
/ 21 февраля 2010

Подпись метода data:

QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const

Ваш метод неконстантный. Сделайте ваш метод const и отметьте переменные, которые вы хотите изменить, как изменяемые.

1 голос
/ 19 апреля 2012

Используйте QFileIconProvider для этой цели.

ThumbnailIconProvider.h

#ifndef THUMBNAILICONPROVIDER_H
#define THUMBNAILICONPROVIDER_H

#include <QFileIconProvider>

class ThumbnailIconProvider : public QFileIconProvider
{
public:
    ThumbnailIconProvider();

    QIcon icon(const QFileInfo & info) const;
};

#endif // THUMBNAILICONPROVIDER_H

ThumbnailIconProvider.cpp

#include "thumbnailiconprovider.h"

#include <QDebug>

ThumbnailIconProvider::ThumbnailIconProvider()
{
}

QIcon ThumbnailIconProvider::icon(const QFileInfo & info) const
{
    QIcon ico(info.absoluteFilePath());
    if (ico.isNull())
        return QFileIconProvider::icon(info);
    else {
        qDebug() << "Fetch icon for " << info.absoluteFilePath();
        return ico;
    }
}

Чтобы использовать этот класс, вызовите setIconProvider для вашей модели.

QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...

Обратите внимание, что вы можете легко встроить кэширование таким образом.

...