Arrow
Arrow28. Februar 2017 02:41

Создание делегата для редактирования данных в QListView

Есть объект QListView у которого установлено:

setViewMode(QListView::IconMode);

Отображаемые данные находятся в модели.

Хочется обеспечить возможность редактировать надписи под иконками в QListView. Для этого создал делегата код которого приведен ниже.

// Заголовочный файл *.h

#include <QItemDelegate>
#include <QLineEdit>
#include <QModelIndex>

class LineEditDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    LineEditDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;

    void setEditorData(QWidget *editor, const QModelIndex &index) const;

    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;

    void updateEditorGeometry(QWidget *editor,
                              const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
// Файл реализации *.cpp

#include "lineeditdelegate.h"

LineEditDelegate::LineEditDelegate(QObject *parent): QItemDelegate(parent)
{

}

QWidget *LineEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /*option*/, const QModelIndex & /*index*/) const
{
     QLineEdit *editor = new QLineEdit(parent);
     return editor;
}

void LineEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::DisplayRole).toString();
    QLineEdit *edit = static_cast<QLineEdit*>(editor);
    edit->setText(value);
}

void LineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QLineEdit *edit = static_cast<QLineEdit*>(editor);
    QString value = edit->text();
    model->setData(index, value, Qt::EditRole);
}

void LineEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

Только теперь остался последний вопрос как его прикрутить к QListView. Пытался сделать так:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->mainList->setSelectionMode(QAbstractItemView::ExtendedSelection);
    ui->mainList->setDragEnabled(true);
    ui->mainList->setAcceptDrops(true);
    ui->mainList->setDropIndicatorShown(true);
    LineEditDelegate *delegate = new LineEditDelegate(this);
    ui->mainList->setItemDelegate(delegate);
}

и пробовал создавать отдельно процедуру для редактирования данных. Ничего не помогло. С делегатами в Qt до этого не работал и нигде не смог найти как его правильно прикручивать к отображению.

Как вариант возможно нужно создать свой класс на основе QListView. Только не совсем как это там реализовать.

Как правильно это реализовать и менее затратно по ресурсам?

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

8
Evgenii Legotckoi
  • 28. Februar 2017 08:13

Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.

#include <QStandardItemModel>
#include <QStandardItem>
#include <QStyle>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->mainList->setSelectionMode(QAbstractItemView::ExtendedSelection);
    ui->mainList->setDragEnabled(true);
    ui->mainList->setAcceptDrops(true);
    ui->mainList->setDropIndicatorShown(true);
    ui->mainList->setViewMode(QListView::IconMode);

    QStandardItemModel *model = new QStandardItemModel();

    QStandardItem *item2 = new QStandardItem();
    item2->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
    item2->setText("Item 2");

    QStandardItem *item1 = new QStandardItem();
    item1->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
    item1->setText("Item 1");

    model->appendRow(item1);
    model->appendRow(item2);

    ui->mainList->setModel(model);
}

Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.

    Arrow
    • 28. Februar 2017 10:12

    Так да все работает - это я знаю, а если так:

    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        ui->mainList->setSelectionMode(QAbstractItemView::ExtendedSelection);
        ui->mainList->setDragEnabled(true);
        ui->mainList->setAcceptDrops(true);
        ui->mainList->setDropIndicatorShown(true);
        ui->mainList->setViewMode(QListView::IconMode);
    
        model = new QFileSystemModel(this);
        ui->mainList->setModel(model);
    }
      Evgenii Legotckoi
      • 28. Februar 2017 11:17

      В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .

      model = new QFileSystemModel(this);
      model->setReadOnly(false);
        Arrow
        • 1. März 2017 02:18

        Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?

          Evgenii Legotckoi
          • 1. März 2017 02:31
          • Die Antwort wurde als Lösung markiert.

          Включите все флаги редактирования для QListView

          ui->mainList->setEditTriggers(QAbstractItemView::AllEditTriggers);
            Arrow
            • 1. März 2017 04:03

            Спасибо все работает.

            Можно еще один вопрос?

            Пытаюсь организовать поиск данных по введенной пользователем строке.

            Реализовал это так:

            void MainWindow::on_serchEdit_textChanged(const QString &arg1)
            {
                model->setFilter(QDir::AllEntries | QDir::Files);
                model->setNameFilterDisables(false);
                model->setNameFilters(QStringList(arg1));
            }

            Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.

              Evgenii Legotckoi
              • 1. März 2017 04:48

              Вот таким вот образом работает

              void MainWindow::on_serchEdit_textChanged(const QString &arg1)
              {
                  model->setFilter(QDir::AllEntries | QDir::Files );
                  model->setNameFilterDisables(false);
                  model->setNameFilters(QStringList("*" + arg1 + "*"));
              }
                Arrow
                • 1. März 2017 07:48

                Спасибо! Я об этом даже и не подумал.

                  Kommentare

                  Nur autorisierte Benutzer können Kommentare posten.
                  Bitte Anmelden oder Registrieren
                  Letzte Kommentare
                  ИМ
                  Игорь Максимов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> в заголовочном файле не работает валидатор.
                  EVA
                  EVA25. Dezember 2023 10:30
                  Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                  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