Создание делегата для редактирования данных в 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 хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Akiv Doros
- Қар. 11, 2024, 10:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 8:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
- molni99
- Қаз. 26, 2024, 8:29 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:20ұпай,
- Бағалау ұпайлары-10
Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.
Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.
Так да все работает - это я знаю, а если так:
В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .
Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?
Включите все флаги редактирования для QListView
Спасибо все работает.
Можно еще один вопрос?
Пытаюсь организовать поиск данных по введенной пользователем строке.
Реализовал это так:
Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.
Вот таким вот образом работает
Спасибо! Я об этом даже и не подумал.