
Создание делегата для редактирования данных в 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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Unknown akadamn
- 24 января 2025 г. 17:14
Qt - Тест 001. Сигналы и слоты
- Результат:84баллов,
- Очки рейтинга4
- Unknown akadamn
- 24 января 2025 г. 16:22
Qt - Тест 001. Сигналы и слоты
- Результат:42баллов,
- Очки рейтинга-8


Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.
Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.
Так да все работает - это я знаю, а если так:
В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .
Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?
Включите все флаги редактирования для QListView
Спасибо все работает.
Можно еще один вопрос?
Пытаюсь организовать поиск данных по введенной пользователем строке.
Реализовал это так:
Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.
Вот таким вот образом работает
Спасибо! Я об этом даже и не подумал.