0

我正在尝试做的事情:覆盖 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))
4

3 回答 3

2

该方法的签名data是:

QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const

你的方法是非常量的。使您的方法为 const 并将您需要修改的变量标记为可变。

于 2010-02-21T11:31:35.103 回答
2

您的函数永远不会被调用,因为它与原始定义data不匹配。您没有重新实现,您提供了一个非常量版本。 data

于 2010-02-21T11:51:52.063 回答
1

为此目的使用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(...);
...

请注意,您可以通过这种方式轻松嵌入缓存。

于 2012-04-19T16:31:51.027 回答