Создание делегата для редактирования данных в 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. Только не совсем как это там реализовать.
Как правильно это реализовать и менее затратно по ресурсам?
2
253
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.
Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.
Так да все работает - это я знаю, а если так:
В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .
Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?
Включите все флаги редактирования для QListView
Спасибо все работает.
Можно еще один вопрос?
Пытаюсь организовать поиск данных по введенной пользователем строке.
Реализовал это так:
Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.
Вот таким вот образом работает
Спасибо! Я об этом даже и не подумал.