Создание делегата для редактирования данных в 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. Только не совсем как это там реализовать.
Как правильно это реализовать и менее затратно по ресурсам?
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Я может быть чего-то не догоняю, только зачем здесь делегат? И так текст редактируется без каких-либо проблем.
Вот например моделька с двумя иконками и текстом под ними. Редактирование происходит.
Так да все работает - это я знаю, а если так:
В данном конкретном случае достаточно лишь отключить режим readOnly у QFileSystemModel .
Спасибо, только как перевести модель (model) или представление (QListView) в режим редактирования без двойного клика по элементу, а скажем по нажатию на клавишу?
Включите все флаги редактирования для QListView
Спасибо все работает.
Можно еще один вопрос?
Пытаюсь организовать поиск данных по введенной пользователем строке.
Реализовал это так:
Только поиск происходит при полном соответствии введенной строки данным. Как можно организовать поиск по всем вхождениям введенных символов.
Вот таким вот образом работает
Спасибо! Я об этом даже и не подумал.