Перезаписать данные и setData в QFILESTEMMODEL QFILESTEMMODEL
-
21-09-2019 - |
Вопрос
Что я пытаюсь сделать: перезаписать QfilesyStemmodel SetData и данные для реализации кэширования изображений в показанном каталоге.
Я использую QlistView для цели тестирования.
Вот соответствующий код:
Мой класс с Qfilesystemmodel в качестве родителя:
.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);
}
Как я называю объектом:
pics = new PicsInFileSystemModel;
form->listViewPictures->setModel(pics);
form->listViewPictures->setRootIndex(pics->index(
"mypath"));
Итак, вот вопрос: по моему мнению, я должен увидеть много выходов отладки, когда представление обращается к модели. Но ничего нет. Есть ли кто -нибудь идея, что я делаю не так?
Спасибо!
РЕДАКТИРОВАТЬ: Ответы работают. Я также должен был изменить это
return ((QFileSystemModel)this).data(index,role);
в
QFileSystemModel::data(index,role))
Решение
Подпись data
Метод:
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Ваш метод не конфиденциально. Сделайте свой метод постоянным и отметьте переменные, необходимые для изменения как изменчивые.
Другие советы
Ваш data
Функция никогда не называется, потому что она не соответствует оригиналу определение. Анкет Ты не переопределение data
, вы предоставили неконфессиональную версию.
Использовать QfileiconProvider для этой цели.
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;
}
}
Чтобы использовать этот класс Call SeticonProvider на вашей модели.
QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...
Обратите внимание, что вы можете легко встроить кэширование таким образом.