IF
Igor Fedyaev19 ноября 2017 г. 6:56

Делегат для QFileSystem

Доброго времени суток!

Я хочу отображать свои иконки при отображении на QListView при работе с директориями из  QFileSystem
Допер что нужно написать свой делегат для представления
Покажите пожалуйста с чего начать и примерчики если можно)
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

10
Evgenii Legotckoi
  • 20 ноября 2017 г. 14:27
  • Ответ был помечен как решение.

Для установки делегата во вьюшку используется метод setItemDelegate()

Самый простой вариант делегата будет, если наследоваться от QStyledItemDelegate и переопределить метод paint
StyledDelegate.h
#ifndef STYLEDDELEGATE_H
#define STYLEDDELEGATE_H

#include <QStyledItemDelegate>

class StyledDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit StyledDelegate(QWidget* parent = nullptr);

    virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};

#endif // STYLEDDELEGATE_H
StyledDelegate.cpp
#include "StyledDelegate.h"

#include <QPainter>

StyledDelegate::StyledDelegate(QWidget* parent) :
    QStyledItemDelegate(parent)
{

}

void StyledDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if (index.column() == 0)
    {
        QRectF imageRect = QRect(option.rect.topLeft(), option.decorationSize);
        painter->drawImage(imageRect, QImage(":/access-point.png"));
        QPointF textPosition = imageRect.topRight();
        textPosition += QPointF(imageRect.width() / 2, 0);
        QRectF textRect = QRectF(textPosition, QSizeF(option.rect.width() - imageRect.width() * 1.5, option.rect.height()));
        painter->drawText(textRect, index.data().toString());
    }
    else
    {
        QStyledItemDelegate::paint(painter, option, index);
    }
}
По поводу модели, вьюшки и установки делегата вот пример
Widget::Widget(QWidget* parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_model = new QFileSystemModel(this);
    m_model->setRootPath("/home/user/");
    ui->treeView->setItemDelegate(new StyledDelegate(this));
    ui->treeView->setModel(m_model);
}
    IF
    • 23 ноября 2017 г. 9:24

    Как нибудь можно узнавать при отрисовке какой это файл?
    Запрашивать  из обработчика дериктории?
    Или можно как то изящней это сдлеать?

      Evgenii Legotckoi
      • 24 ноября 2017 г. 6:33

      В методе paint у делегата передаётся QModelIndex. У него есть метод data(), который может возвратить необходимую информацию. Например имя файла. А там путём нехитрых манипуляций с расширением файла в его имени можно будет определить предполагаемый тип файла.

        IF
        • 24 ноября 2017 г. 8:08
        • (ред.)

        Чуть полазил в интернете и получилось так, что можно проще сделать.
        Переопределив QFileSystemModel а именно метод data получаем:
        С условием то что нам нужен парс файлов дирректории и всего в этом роде, получаем!(причём стандартно вызываем , причём при указания в конструкторе this валится(я не переопределял конструктор), но определив пустой конструктор-всё работает! (скорее всего надо чуть переопределить конструктор и всё)

        Прелесть данной реализации в том, что работают иконки и стандартные системы и наши иконки, которые мы захотели паристь!!!

        #ifndef MYQFILESYSTEMMODEL_H
        #define MYQFILESYSTEMMODEL_H
        
        //#include <QWidget>
        #include <QFileSystemModel>
        
        class MyQFileSystemModel : public QFileSystemModel
        {
        public:
            QVariant data(const QModelIndex &index, int role) const;
        };
        
        #endif // MYQFILESYSTEMMODEL_H
        

        #include "myqfilesystemmodel.h"
        QVariant MyQFileSystemModel::data(const QModelIndex &index, int role) const
        {
        QFileInfo info=fileInfo(index);
        if (index.isValid() && index.column() == 0 && role == Qt::DecorationRole ) // если запрашивается иконка для отображения создаем
        {
        if(info.isDir()){
        return QIcon(":/imag/icon/53.ico");//ваши иконки для дирректории
        }
        else if(info.isFile() && info.suffix()=="sgy")
        {
        return QIcon(":/imag/icon/62.ico");//ваши иконки для какого-то фйла расширения "sgy"
        }
        }
        return QFileSystemModel::data(index,role); // если запрашивается не иконка, возвращаем значение по умолчанию
        }
          Evgenii Legotckoi
          • 24 ноября 2017 г. 8:34

          Ну... Вы спрашивали про делегат ))
          А так да, так тоже работает ))

            IF
            • 24 ноября 2017 г. 8:42

            ну да, я пытался вывернуться слишком сильно, что не очень правильно в программировании)))
            и да с обьетом this я просто переопределил так ктострутор и всё)))

            MyQFileSystemModel::MyQFileSystemModel()
            {
            }
            
            MyQFileSystemModel::MyQFileSystemModel(QObject* parent):QFileSystemModel(parent)
            {
            }

              Evgenii Legotckoi
              • 24 ноября 2017 г. 8:46

              И какой из двух конструкторов Вы использовали?

                IF
                • 24 ноября 2017 г. 8:49

                и тот и другой пробовал, работает всё корректно

                model(new MyQFileSystemModel()),

                model(new MyQFileSystemModel(this)),

                  Evgenii Legotckoi
                  • 24 ноября 2017 г. 8:50
                  • (ред.)

                  Лучше используйте тот, что принимает указатель на парента. Это сделано, чтобы упростить отслеживание ошибок, утечек памяти, удаление объектов и т.д.

                    IF
                    • 24 ноября 2017 г. 8:51

                    Я его и использую)))(я как то натыкался в документации на это)
                    спасибо больше за советы и хороший форум)))

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                      AD

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:50баллов,
                      • Очки рейтинга-4
                      m
                      • molni99
                      • 26 октября 2024 г. 11:37

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:80баллов,
                      • Очки рейтинга4
                      m
                      • molni99
                      • 26 октября 2024 г. 11:29

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:20баллов,
                      • Очки рейтинга-10
                      Последние комментарии
                      ИМ
                      Игорь Максимов22 ноября 2024 г. 22:51
                      Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      Evgenii Legotckoi
                      Evgenii Legotckoi1 ноября 2024 г. 0:37
                      Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                      A
                      ALO1ZE19 октября 2024 г. 18:19
                      Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5 октября 2024 г. 17:51
                      Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55 июля 2024 г. 21:02
                      QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      Сейчас обсуждают на форуме
                      Evgenii Legotckoi
                      Evgenii Legotckoi25 июня 2024 г. 1:11
                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                      t
                      tonypeachey115 ноября 2024 г. 17:04
                      google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                      NSProject
                      NSProject4 июня 2022 г. 13:49
                      Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                      9
                      9Anonim25 октября 2024 г. 19:10
                      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                      Следите за нами в социальных сетях