Ecraser données et setData dans le QFileSystemModel de Qt
-
21-09-2019 - |
Question
Que faire I'am essayer: Ecraser setData de QFileSystemModel et des données pour mettre en œuvre des images dans Caching le répertoire affiché.
J'utilise un QListView à des fins de test.
Voici le code correspondant:
Ma classe avec QFileSystemModel comme parent:
.h fichier:
#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-file:
#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);
}
Comment j'appelle l'objet:
pics = new PicsInFileSystemModel;
form->listViewPictures->setModel(pics);
form->listViewPictures->setRootIndex(pics->index(
"mypath"));
Voici donc la question: À mon avis, je devrais voir beaucoup de sorties de débogage lorsque l'affichage d'accès du modèle. Mais il n'y a rien. Quelqu'un at-il une idée de ce que I'am faire le mal?
Merci!
EDIT: Les réponses fonctionnent. Je devais aussi changer cette
return ((QFileSystemModel)this).data(index,role);
dans
QFileSystemModel::data(index,role))
La solution
Signature de la méthode de data
est:
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Votre méthode est non-const. Faites votre méthode const et marquer les variables que vous devez modifier mutable.
Autres conseils
Utilisez QFileIconProvider à cette fin.
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;
}
}
Pour utiliser cet appel classe setIconProvider sur votre modèle.
QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...
Notez que vous pouvez facilement intégrer en tant que cache cette façon.