QT的QFILESYSTEMMODEL中的数据和setData覆盖数据和setData
-
21-09-2019 - |
题
我要做的是:覆盖qfilesystemmodel的setData和数据以在显示的目录中实现图片的缓存。
我使用QListView进行测试目的。
这是相关代码:
我的课程与qfilesystemmodel为父:
.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_
.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);
}
我如何称呼对象:
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
您的方法是非const的。使您的方法const并标记您需要修改为可变的变量。
其他提示
您的 data
函数从未被调用,因为它与原始 定义. 。你不是 重新进化 data
, ,您提供了一个非const版本。
利用 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;
}
}
在模型上使用此类呼叫seticonProvider。
QFileSystemModel * model = new QFileSystemModel(this);
model->setIconProvider(new ThumbnailIconProvider());
model->setRootPath(...);
...
请注意,您可以轻松地以这种方式嵌入缓存。
不隶属于 StackOverflow