Pregunta

Lo que estoy tratando de hacer: sobrescribir los datos y datos de QfilesystemModel para implementar el almacenamiento en caché de imágenes en el directorio mostrado.

Utilizo un QListView para fines de prueba.

Aquí está el código relevante:

Mi clase con qfilesystemmodel como padre:

.h-archivo:

#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-archivo:

#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);
}

Cómo llamo al objeto:

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

Así que aquí está la pregunta: en mi opinión, debería ver muchas salidas de depuración cuando la vista acceda al modelo. Pero no hay nada. ¿Alguien tiene una idea de lo que estoy haciendo mal?

¡Gracias!

Editar: las respuestas funcionan. También tuve que cambiar esto

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

dentro

QFileSystemModel::data(index,role))
¿Fue útil?

Solución

Firma del data El método es:

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

Su método no es const. Haga su método const y marque las variables que necesita para modificar como mutables.

Otros consejos

Su data la función nunca se llama porque no coincide con el original definición. Usted no reimplemento data, proporcionó una versión no cable.

Usar QfileiconProvider para ese propósito.

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;
    }
}

Para usar esta clase SeticonProvider en su modelo.

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

Tenga en cuenta que puede incrustar fácilmente la caché de esta manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top