Создание делегата для редактирования данных в 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.
Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.
Так да все работает - это я знаю, а если так:
В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .
Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?
Включите все флаги редактирования для QListView
Спасибо все работает.
Можно еще один вопрос?
Пытаюсь организовать поиск данных по введенной пользователем строке.
Реализовал это так:
Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.
Вот таким вот образом работает
Спасибо! Я об этом даже и не подумал.