Класс QAbstractItemDelegate
Класс QAbstractItemDelegate используется для отображения и редактирования элементов данных из модели. Подробнее...
| Заголовок: | #include <QAbstractItemDelegate> |
| qmake: | QT += widgets |
| Наследует: | QObject |
| Наследуется от: |
Типы
| перечисление | EndEditHint { НетЗначения, РедактироватьСледующийЭлемент, РедактироватьПредыдущийЭлемент, ОтправитьКэшМодели, ВернутьКэшМодели } |
Открытые функции
| QAbstractItemDelegate(QObject *parent = nullptr) | |
| виртуальный | ~QAbstractItemDelegate() |
| виртуальный QWidget * | createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const |
| виртуальный void | destroyEditor(QWidget *editor, const QModelIndex &index) const |
| виртуальный bool | editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) |
| виртуальный bool | helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) |
| виртуальный void | paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| виртуальный void | setEditorData(QWidget *editor, const QModelIndex &index) const |
| виртуальный void | setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const |
| виртуальный QSize | sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| виртуальный void | updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const |
Сигналы
| void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
| void | commitData(QWidget *editor) |
| void | sizeHintChanged(const QModelIndex &index) |
Подробное описание
Класс QAbstractItemDelegate предоставляет интерфейс и общую функциональность для делегатов в архитектуре модель/представление. Делегаты отображают отдельные элементы в представлениях и обрабатывают редактирование данных модели.
Класс QAbstractItemDelegate является одним из классов модели/представления и входит в фреймворк Qt модель/представление.
Для визуализации элемента нестандартным образом необходимо реализовать paint() и sizeHint(). Класс QStyledItemDelegate предоставляет стандартные реализации этих функций; если не требуется кастомная визуализация, следует вместо этого наследовать от этого класса.
Мы приводим пример отрисовки полосы прогресса в элементах; в нашем случае для программы управления пакетами.
Мы создаём класс WidgetDelegate , который наследуется от QStyledItemDelegate. Отрисовка выполняется в функции paint():
void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 1) {
int progress = index.data().toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,
&progressBarOption, painter);
} else
QStyledItemDelegate::paint(painter, option, index); Обратите внимание, что мы используем QStyleOptionProgressBar и инициализируем его члены. Затем мы можем использовать текущий QStyle для отрисовки.
Для предоставления кастомного редактирования можно использовать два подхода. Первый подход заключается в создании виджета редактора и отображении его непосредственно поверх элемента. Для этого нужно переопределить createEditor() для предоставления виджета редактора, setEditorData() для заполнения редактора данными из модели и setModelData() для обновления модели данными из редактора.
Второй подход заключается в непосредственной обработке событий пользователя путём переопределения editorEvent().
См. также Программирование с помощью моделей и представлений, QStyledItemDelegate, Пример Pixelator, QStyledItemDelegate и QStyle.
Документация по типам членов
enum QAbstractItemDelegate::EndEditHint
Этот перечисление описывает различные подсказки, которые делегат может предоставить компонентам модели и представления, чтобы сделать редактирование данных в модели удобным для пользователя.
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::NoHint |
0 |
Нет рекомендуемых действий. |
Эти подсказки позволяют делегату влиять на поведение представления:
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::EditNextItem |
1 |
Представление должно использовать делегат для открытия редактора на следующем элементе в представлении. |
QAbstractItemDelegate::EditPreviousItem |
2 |
Представление должно использовать делегат для открытия редактора на предыдущем элементе в представлении. |
Обратите внимание, что пользовательские представления могут интерпретировать понятия «следующий» и «предыдущий» по-разному.
Следующие подсказки наиболее полезны при использовании моделей, кэширующих данные, таких как те, которые обрабатывают данные локально, чтобы повысить производительность или сохранить пропускную способность сети.
| Постоянная | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache |
3 |
Если модель кэширует данные, она должна записать кэшированные данные в базовый хранилище данных. |
QAbstractItemDelegate::RevertModelCache |
4 |
Если модель кэширует данные, она должна удалить кэшированные данные и заменить их данными из базового хранилища данных. |
Хотя модели и представления должны реагировать на эти подсказки соответствующим образом, пользовательские компоненты могут игнорировать любые или все из них, если они не имеют отношения.
Документация по функциям членов
QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
Создаёт новый абстрактный делегат элемента с заданным parent.
[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
Этот сигнал излучается, когда пользователь завершил редактирование элемента, используя указанный editor.
hint предоставляет способ для делегата влиять на то, как ведут себя модель и представление после завершения редактирования. Он указывает этим компонентам, какое действие должно быть выполнено далее, чтобы обеспечить удобный опыт редактирования для пользователя. Например, если указано EditNextItem, представление должно использовать делегат для открытия редактора на следующем элементе в модели.
См. также EndEditHint.
[signal] void QAbstractItemDelegate::commitData(QWidget *editor)
Этот сигнал должен быть излучен, когда виджет editor завершил редактирование данных и хочет записать их обратно в модель.
[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)
Этот сигнал должен быть излучен, когда sizeHint() для index изменился.
Представления автоматически подключаются к этому сигналу и переупорядочивают элементы по мере необходимости.
Эта функция была представлена в Qt 4.4.
[virtual] QAbstractItemDelegate::~QAbstractItemDelegate()
Уничтожает абстрактный делегат элемента.
[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Возвращает редактор, который будет использоваться для редактирования элемента данных с заданным index. Обратите внимание, что индекс содержит информацию о используемой модели. Виджет-родитель редактора задаётся параметром parent, а параметры элемента — параметром option.
Базовая реализация возвращает nullptr. Если вам требуется пользовательское редактирование, вам нужно переопределить эту функцию.
Возвращаемый виджет редактора должен иметь Qt::StrongFocus; в противном случае, QMouseEvent, полученные виджетом, будут распространяться на представление. Фоновый цвет представления будет виден, если виджет редактора не нарисует свой собственный фоновый цвет (например, с помощью setAutoFillBackground()).
См. также destroyEditor(), setModelData() и setEditorData().
[virtual] void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
Вызывается, когда editor больше не нужен для редактирования элемента данных с заданным index и должен быть уничтожен. По умолчанию происходит вызов deleteLater для редактора. Можно, например, избежать этого удаления, переопределив эту функцию.
Эта функция была представлена в Qt 5.0.
См. также createEditor().
[virtual] bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
При начале редактирования элемента, эта функция вызывается с событием event, которое вызвало редактирование, моделью model, индексом index элемента и параметрами option, используемыми для отображения элемента.
События мыши отправляются в editorEvent(), даже если они не начинают редактирование элемента. Это может быть полезно, например, если вы хотите открыть контекстное меню при нажатии правой кнопки мыши на элементе.
Базовая реализация возвращает %%%CODE_BLOCK_21%% (указывается, что событие не обрабатывалось).
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
Всякий раз, когда происходит событие справки, эта функция вызывается с событием event, представлением view, параметрами option и index, которые соответствуют элементу, где происходит событие.
Возвращает %%%CODE_BLOCK_23%%, если делегат может обработать событие; в противном случае возвращает %%%CODE_BLOCK_24%%. Возвращаемое значение true указывает, что полученные с помощью индекса данные содержат необходимую роль.
Для событий QEvent::ToolTip и QEvent::WhatsThis, которые были обработаны успешно, соответствующее всплывающее окно может быть показано в зависимости от конфигурации системы пользователя.
Эта функция была представлена в Qt 4.3.
См. также QHelpEvent.
[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Эта чистая абстрактная функция должна быть переопределена, если вы хотите обеспечить пользовательское отображение. Используйте painter и стили option для отображения элемента, указанного индексом элемента index.
Если вы переопределяете эту функцию, вы также должны переопределить sizeHint().
[virtual] void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Устанавливает содержимое заданного editor на данные для элемента в заданном index. Обратите внимание, что индекс содержит информацию о используемой модели.
Базовая реализация ничего не делает. Если вам требуется пользовательское редактирование, вам нужно переопределить эту функцию.
См. также setModelData().
[virtual] void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Устанавливает данные для элемента в заданном index в model на содержимое заданного editor.
Базовая реализация ничего не делает. Если вам требуется пользовательское редактирование, вам нужно переопределить эту функцию.
См. также setEditorData().
[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Эта чистая абстрактная функция должна быть переопределена, если вы хотите обеспечить пользовательское отображение. Параметры задаются option, а элемент модели — index.
Если вы переопределяете эту функцию, вы также должны переопределить paint().
END_OF_DOCUMENT_MARKER
[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Обновляет геометрию editor для элемента с заданным index в соответствии с прямоугольником, указанным в option. Если элемент имеет внутреннюю компоновку, редактор будет отформатирован соответствующим образом. Обратите внимание, что индекс содержит информацию о используемой модели.
Базовая реализация ничего не делает. Если вам нужна настройка редактирования, необходимо переопределить эту функцию.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qabstractitemdelegate.html