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

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

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                      e
                      • ehot
                      • 1 апреля 2024 г. 0:29

                      C++ - Тест 003. Условия и циклы

                      • Результат:78баллов,
                      • Очки рейтинга2
                      B

                      C++ - Тест 002. Константы

                      • Результат:16баллов,
                      • Очки рейтинга-10
                      B

                      C++ - Тест 001. Первая программа и типы данных

                      • Результат:46баллов,
                      • Очки рейтинга-6
                      Последние комментарии
                      k
                      kmssr9 февраля 2024 г. 5:43
                      Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      АК
                      Анатолий Кононенко5 февраля 2024 г. 12:50
                      Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      EVA
                      EVA25 декабря 2023 г. 21:30
                      Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                      J
                      JonnyJo25 декабря 2023 г. 19:38
                      Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                      G
                      Gvozdik19 декабря 2023 г. 8:01
                      Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                      Сейчас обсуждают на форуме
                      a
                      a_vlasov14 апреля 2024 г. 16:41
                      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                      Павел Дорофеев
                      Павел Дорофеев14 апреля 2024 г. 12:35
                      QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                      Mm
                      Mind mingles12 апреля 2024 г. 10:42
                      ASO Service Forum: Enhancing App Visibility and Reach Welcome to the ASO Service Forum, your ultimate destination for insights, discussions, and strategies revolving around App Store Optimization. ASO (App Store Optimization) is paramoun…
                      f
                      fastrex4 апреля 2024 г. 14:47
                      Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                      P
                      Pisych27 февраля 2023 г. 15:04
                      Как получить в массив значения из связанной модели? Спасибо, разобрался:))

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