Sobrescribir datos y establecer en el QfilesystemModel de QT
-
21-09-2019 - |
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))
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.