Вопрос

Что я пытаюсь сделать: перезаписать 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(...);
...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top