IF
Igor Fedyaev19. November 2017 06:56

Делегат для QFileSystem

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

Я хочу отображать свои иконки при отображении на QListView при работе с директориями из  QFileSystem
Допер что нужно написать свой делегат для представления
Покажите пожалуйста с чего начать и примерчики если можно)
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

10
Evgenii Legotckoi
  • 20. November 2017 14:27
  • Die Antwort wurde als Lösung markiert.

Для установки делегата во вьюшку используется метод 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. November 2017 09:24

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

      Evgenii Legotckoi
      • 24. November 2017 06:33

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

        IF
        • 24. November 2017 08:08
        • (bearbeitet)

        Чуть полазил в интернете и получилось так, что можно проще сделать.
        Переопределив 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. November 2017 08:34

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

            IF
            • 24. November 2017 08:42

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

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

              Evgenii Legotckoi
              • 24. November 2017 08:46

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

                IF
                • 24. November 2017 08:49

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

                model(new MyQFileSystemModel()),

                model(new MyQFileSystemModel(this)),

                  Evgenii Legotckoi
                  • 24. November 2017 08:50
                  • (bearbeitet)

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

                    IF
                    • 24. November 2017 08:51

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

                      Kommentare

                      Nur autorisierte Benutzer können Kommentare posten.
                      Bitte Anmelden oder Registrieren
                      Letzte Kommentare
                      A
                      ALO1ZE19. Oktober 2024 08:19
                      Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5. Oktober 2024 07:51
                      Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55. Juli 2024 11:02
                      QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssr8. Februar 2024 18:43
                      Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Jetzt im Forum diskutieren
                      J
                      JacobFib17. Oktober 2024 03:27
                      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                      JW
                      Jhon Wick1. Oktober 2024 15:52
                      Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                      КГ
                      Кирилл Гусарев27. September 2024 09:09
                      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                      F
                      Fynjy22. Juli 2024 04:15
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Folgen Sie uns in sozialen Netzwerken