Sovrascrivere i dati e setData in QFileSystemModel di Qt
-
21-09-2019 - |
Domanda
Cosa I'am cercando di fare: Sovrascrivere setData ei dati di QFileSystemModel per implementare la cache delle immagini nella directory indicata.
Io uso un QListView a scopo di test.
Ecco il codice corrispondente:
La mia classe con QFileSystemModel come genitore:
.h-file:
#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);
}
Come io chiamo l'oggetto:
pics = new PicsInFileSystemModel;
form->listViewPictures->setModel(pics);
form->listViewPictures->setRootIndex(pics->index(
"mypath"));
Quindi, ecco la domanda: A mio parere dovrei vedere molte uscite di debug quando la vista accedere al modello. Ma non c'è nulla. Qualcuno ha un'idea di cosa I'am facendo male?
Grazie!
EDIT: Le risposte funzionano. Ho anche dovuto cambiare questo
return ((QFileSystemModel)this).data(index,role);
in
QFileSystemModel::data(index,role))
Soluzione
Firma del metodo data
è:
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Il vostro metodo è non-const. Fai il tuo metodo const e contrassegnare le variabili è necessario modificare come mutabile.
Altri suggerimenti
Usa QFileIconProvider a tal fine.
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;
}
}
Per usare questa chiamata setIconProvider classe del modello.
QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...
Si noti che si può facilmente incorporare cacheing questo modo.