Класс 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.
Документация типов членов
Перечисление QAbstractItemDelegate::EndEditHint
Это перечисление описывает различные подсказки, которые делегат может предоставить компонентам модели и представления, чтобы сделать редактирование данных в модели удобным для пользователя.
| Константа | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::NoHint |
0 |
Нет рекомендуемых действий. |
Эти подсказки позволяют делегату влиять на поведение представления:
| Константа | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::EditNextItem |
1 |
Представление должно использовать делегат для открытия редактора для следующего элемента в представлении. |
QAbstractItemDelegate::EditPreviousItem |
2 |
Представление должно использовать делегат для открытия редактора для предыдущего элемента в представлении. |
Обратите внимание, что пользовательские представления могут интерпретировать понятия «следующий» и «предыдущий» по-разному.
Следующие подсказки наиболее полезны при использовании моделей, которые кэшируют данные, таких как те, которые обрабатывают данные локально для повышения производительности или экономии пропускной способности сети.
| Константа | Значение | Описание |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache |
3 |
Если модель кэширует данные, она должна записать данные в кэше в основной источник данных. |
QAbstractItemDelegate::RevertModelCache |
4 |
Если модель кэширует данные, она должна отбросить данные из кэша и заменить их данными из основного источника данных. |
Хотя модели и представления должны реагировать на эти подсказки соответствующим образом, пользовательские компоненты могут игнорировать любые или все из них, если они не релевантны.
Документация по функциям членов
QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
Создает новый делегат абстрактного элемента с указанным parent.
ЗакрытьРедакторvoid QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
Этот сигнал излучается, когда пользователь завершил редактирование элемента с использованием указанного editor.
hint предоставляет способ для делегата влиять на поведение модели и представления после завершения редактирования. Он указывает этим компонентам какое действие должно быть выполнено в дальнейшем для обеспечения комфортного редактирования для пользователя. Например, если EditNextItem указано, представление должно использовать делегат для открытия редактора для следующего элемента в модели.
См. также EndEditHint.
ЗавершитьДанные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(), даже если они не начинают редактирование элемента. Это, например, может быть полезно, если вы хотите открыть контекстное меню при нажатии правой кнопки мыши на элементе.
Базовая реализация возвращает false (указывается, что событие не обработано).
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
Всякий раз, когда происходит событие справки, эта функция вызывается с event, view, option и index, соответствующими элементу, на котором произошло событие.
Возвращает true если делегат может обработать событие; в противном случае возвращает false. Значение 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().
[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.15/qabstractitemdelegate.html