Spec-Zone.ru › Qt

Класс QAbstractItemDelegate

Класс QAbstractItemDelegate используется для отображения и редактирования элементов данных из модели. Подробнее...

Заголовок: #include <QAbstractItemDelegate>
CMake: find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Наследует: QObject
Наследует:

QItemDelegate и QStyledItemDelegate

  • Список всех членов, включая унаследованные

Типы

Перечисление 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 изменилось.

Представления автоматически подключаются к этому сигналу и перестраивают элементы при необходимости.

[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, since 5.0] 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, которые были обработаны успешно, соответствующее всплывающее окно может быть показано в зависимости от конфигурации системы пользователя.

См. также 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-6.2/qabstractitemdelegate.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API