Substitua dados e setData no QFileSystemModel do Qt
-
21-09-2019 - |
Pergunta
O que estou tentando fazer:Substitua setData e dados de QFileSystemModel para implementar o cache de imagens no diretório mostrado.
Eu uso um QListView para fins de teste.
Aqui está o código relevante:
Minha classe com QFileSystemModel como pai:
arquivo .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_
Arquivo .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);
}
Como eu chamo o objeto:
pics = new PicsInFileSystemModel;
form->listViewPictures->setModel(pics);
form->listViewPictures->setRootIndex(pics->index(
"mypath"));
Então aqui está a questão:Na minha opinião, devo ver muitas saídas de depuração quando o View acessar o modelo.Mas não há nada.Alguém tem ideia do que estou fazendo de errado?
Obrigado!
EDITAR:As respostas funcionam.Eu também tive que mudar isso
return ((QFileSystemModel)this).data(index,role);
em
QFileSystemModel::data(index,role))
Solução
Assinatura do data
método é:
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Seu método não é const.Torne seu método const e marque as variáveis que você precisa modificar como mutáveis.
Outras dicas
Sua data
A função nunca é chamada porque não corresponde ao original definição. Você não é reimplementar data
, você forneceu uma versão não consagrada.
Usar Qfileiconprovider para aquele 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 classe Call SeticonProvider em seu modelo.
QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...
Observe que você pode incorporar facilmente o cache dessa maneira.