Перезаписать данные и установить данные в Qt QFileSystemModel

Что я пытаюсь сделать: перезаписать setData и данные QFileSystemModel для реализации кэширования изображений в указанном каталоге.

Я использую 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))

person Herrbert    schedule 21.02.2010    source источник
comment
Я также создаю пользовательскую модель, аналогичную ей, но размер столбца данных элемента составляет 0 байт.   -  person kien bui    schedule 22.05.2018


Ответы (3)


Сигнатура метода data:

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

Ваш метод не является константным. Сделайте свой метод постоянным и отметьте переменные, которые необходимо изменить, как изменяемые.

person Lukáš Lalinský    schedule 21.02.2010
comment
Спасибо, это была проблема. Мне также пришлось изменить этот return ((QFileSystemModel)this).data(index,role); в return ((const QFileSystemModel *)this)->data(index,role); - person Herrbert; 21.02.2010
comment
в порядке. лекция о полиморфизме была слишком давно, правильный синтаксис: QFileSystemModel::data(index,role) - person Herrbert; 21.02.2010

Ваша функция data никогда не вызывается, поскольку она не соответствует исходному определению. Вы не повторно реализуете data, вы предоставили неконстантную версию.

person Sofahamster    schedule 21.02.2010

Используйте для этой цели 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(...);
...

Обратите внимание, что вы можете легко внедрить кэширование таким образом.

person user993954    schedule 19.04.2012