Класс QStyledItemDelegate
Класс QStyledItemDelegate предоставляет средства отображения и редактирования элементов данных из модели. Подробнее...
| Заголовок: | #include <QStyledItemDelegate> |
| qmake: | QT += widgets |
| С тех пор: | Qt 4.2) |
| Наследует: | QAbstractItemDelegate |
Этот класс был представлен в Qt 4.2).
Открытые функции
| QStyledItemDelegate(QObject *parent = nullptr) | |
| виртуальный | ~QStyledItemDelegate() |
| виртуальный QString | displayText(const QVariant &value, const QLocale &locale) const |
| QItemEditorFactory * | itemEditorFactory() const |
| void | setItemEditorFactory(QItemEditorFactory *factory) |
Переопределённые открытые функции
| виртуальный QWidget * | createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| виртуальный void | paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| виртуальный void | setEditorData(QWidget *editor, const QModelIndex &index) const override |
| виртуальный void | setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override |
| виртуальный QSize | sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| виртуальный void | updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
Защищённые функции
| виртуальный void | initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const |
Переопределённые защищённые функции
| виртуальный bool | editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override |
| виртуальный bool | eventFilter(QObject *editor, QEvent *event) override |
Подробное описание
При отображении данных из моделей в виджетах Qt item views, например, QTableView, отдельные элементы отрисовываются делегатом. Также, когда элемент редактируется, он предоставляет виджет редактора, который размещается поверх представления элементов во время редактирования. QStyledItemDelegate является делегатом по умолчанию для всех Qt item views и устанавливается на них при их создании.
Класс QStyledItemDelegate является одним из классов модели/представления и входит в состав фреймворка Qt модель/представление. Делегат позволяет разрабатывать отображение и редактирование элементов независимо от модели и представления.
Данные элементов в моделях присваиваются роли данных; каждый элемент может хранить QVariant для каждой роли. QStyledItemDelegate реализует отображение и редактирование наиболее распространённых типов данных, ожидаемых пользователями, включая булевы значения, целые числа и строки.
Данные будут отображаться по-разному в зависимости от роли, которую они имеют в модели. В следующей таблице описаны роли и типы данных, которые может обрабатывать делегат для каждой из них. Часто достаточно убедиться, что модель возвращает соответствующие данные для каждой роли, чтобы определить внешний вид элементов в представлениях.
| Роль | Поддерживаемые типы |
|---|---|
| Qt::BackgroundRole | QBrush ( |
| Qt::BackgroundColorRole | QColor (устарело; используйте Qt::BackgroundRole вместо) |
| Qt::CheckStateRole | Qt::CheckState |
| Qt::DecorationRole | QIcon, QPixmap, QImage и QColor |
| Qt::DisplayRole | QString и типы с строковым представлением |
| Qt::EditRole | См. QItemEditorFactory для подробностей |
| Qt::FontRole | QFont |
| Qt::SizeHintRole | QSize |
| Qt::TextAlignmentRole | Qt::Alignment |
| Qt::ForegroundRole | QBrush ( |
| Qt::TextColorRole | QColor (устарело; используйте Qt::ForegroundRole вместо) |
Редакторы создаются с помощью QItemEditorFactory; по умолчанию статический экземпляр, предоставленный QItemEditorFactory, устанавливается на все делегаты элементов. Вы можете установить пользовательский фабрику с помощью setItemEditorFactory() или установить новую фабрику по умолчанию с помощью QItemEditorFactory::setDefaultFactory(). Данные, хранящиеся в модели элемента с ролью EditRole, редактируются. См. класс QItemEditorFactory для более высокого уровня введения в фабрики редакторов элементов. Пример Color Editor Factory демонстрирует, как создавать пользовательские редакторы с помощью фабрики.
Наследование QStyledItemDelegate
Если делегат не поддерживает отрисовку необходимых типов данных или вы хотите настроить отрисовку элементов, вам нужно унаследовать от QStyledItemDelegate и переопределить paint() и, возможно, sizeHint(). Функция paint() вызывается индивидуально для каждого элемента, а с помощью sizeHint() вы можете указать подсказку для каждого из них.
При переопределении paint() обычно обрабатываются типы данных, которые вы хотите отобразить, а для других типов используется реализация суперкласса.
Отрисовка индикаторов флажков выполняется текущим стилем. Стиль также определяет размер и ограничивающие прямоугольники, в которых необходимо отображать данные для разных ролей данных. Ограничивающий прямоугольник самого элемента также вычисляется стилем. При отрисовке уже поддерживаемых типов данных, поэтому рекомендуется запрашивать у стиля эти ограничивающие прямоугольники. Это описано подробнее в описании класса QStyle.
Если вы хотите изменить какие-либо из вычисленных стилем ограничивающих прямоугольников или отрисовку индикаторов флажков, вы можете унаследовать от QStyle. Однако обратите внимание, что размер элементов также может быть изменён путём переопределения sizeHint().
Пользовательский делегат может предоставлять редакторы без использования фабрики редакторов элементов. В этом случае необходимо переопределить следующие виртуальные функции:
- createEditor() возвращает виджет, используемый для изменения данных из модели, и может быть переопределён для настройки поведения редактирования.
- setEditorData() предоставляет виджету данные для обработки.
- updateEditorGeometry() гарантирует, что редактор отображается правильно относительно представления элементов.
- setModelData() возвращает обновлённые данные модели.
Пример Star Delegate создаёт редакторы путём переопределения этих методов.
QStyledItemDelegate против QItemDelegate
С Qt 4.4 существуют два класса делегатов: QItemDelegate и QStyledItemDelegate. Однако, по умолчанию используется QStyledItemDelegate. Эти два класса — независимые альтернативы для отрисовки и предоставления редакторов для элементов в представлениях. Разница между ними заключается в том, что QStyledItemDelegate использует текущий стиль для отрисовки своих элементов. Поэтому мы рекомендуем использовать QStyledItemDelegate в качестве базового класса при реализации пользовательских делегатов или при работе со стилями Qt. Код, необходимый для любого из этих классов, должен быть одинаковым, если только пользовательский делегат не нуждается в использовании стиля для отрисовки.
Если вы хотите настроить отрисовку представлений элементов, вам следует реализовать пользовательский стиль. Подробности см. в документации класса QStyle.
См. также Классы делегатов, QItemDelegate, QAbstractItemDelegate, QStyle, Пример делегата Spin Box, Пример делегата Star и Пример фабрики редакторов цвета.
Документация по членам-функциям
QStyledItemDelegate::QStyledItemDelegate(QObject *parent = nullptr)
Создаёт делегат элементов с заданным parent.
[virtual] QStyledItemDelegate::~QStyledItemDelegate()
Удаляет делегат элементов.
[override virtual] QWidget *QStyledItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределяет: QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const.
Возвращает виджет, используемый для редактирования элемента, указанного index, для редактирования. Виджет parent и стиль option используются для управления внешним видом виджета редактора.
См. также QAbstractItemDelegate::createEditor().
[virtual] QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const
Эта функция возвращает строку, которую делегат будет использовать для отображения Qt::DisplayRole модели в locale. value — значение Qt::DisplayRole, предоставленное моделью.
Реализация по умолчанию использует QLocale::toString для преобразования value в QString.
Эта функция не вызывается для пустых индексов модели, то есть для индексов, для которых модель возвращает недействительный QVariant.
См. также QAbstractItemModel::data().
[override virtual protected] bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Переопределяет: QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index).
[override virtual protected] bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event)
Переопределяет: QObject::eventFilter(QObject *watched, QEvent *event).
Возвращает true если данный editor является допустимым QWidget и данный event обрабатывается; в противном случае возвращает false. По умолчанию обрабатываются следующие события нажатия клавиш:
- Tab
- Backtab
- Enter
- Return
- Esc
Если тип editor — QTextEdit или QPlainTextEdit, то клавиши Enter и Return не обрабатываются.
В случае нажатия клавиш Tab, Backtab, Enter и Return данные editor сохраняются в модели, и редактор закрывается. Если событие — нажатие клавиши Tab, в представлении откроется редактор на следующем элементе. Аналогично, если событие — нажатие клавиши Backtab, в представлении откроется редактор на предыдущем элементе.
Если событие — нажатие клавиши Esc, редактор закрывается без сохранения его данных.
См. также commitData() и closeEditor().
[virtual protected] void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
Инициализирует option значениями, используя индекс index. Этот метод полезен для подклассов, когда им требуется QStyleOptionViewItem, но они не хотят заполнять всю информацию сами.
См. также QStyleOption::initFrom().
QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const
Возвращает фабрику редакторов, используемую делегатом элементов. Если фабрика редакторов не задана, функция вернёт null.
См. также setItemEditorFactory().
[override virtual] void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределяет: QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const.
Отображает делегат с помощью заданного painter и стиля option для элемента, указанного index.
Эта функция отрисовывает элемент с помощью QStyle представления.
При переопределении paint в подклассе используйте initStyleOption() для настройки option таким же образом, как в QStyledItemDelegate.
По возможности используйте option при отрисовке. Особенно его переменную rect для определения места отрисовки и его переменную state для определения, активен ли он или выбран.
После отрисовки убедитесь, что painter возвращён в состояние, в котором он был при вызове этой функции. Например, может быть полезно вызвать QPainter::save() перед отрисовкой и QPainter::restore() после.
См. также QItemDelegate::paint(), QStyle::drawControl() и QStyle::CE_ItemViewItem.
[override virtual] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Переопределяет: QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const.
Устанавливает данные для отображения и редактирования в editor из данных элемента модели, указанного индексом модели index.
Реализация по умолчанию хранит данные в пользовательском свойстве виджета editor.
См. также QMetaProperty::isUser().
void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory)
Устанавливает фабрику редакторов, которая будет использоваться делегатом элементов, в качестве заданной factory. Если фабрика редакторов не задана, делегат элементов будет использовать фабрику редакторов по умолчанию.
См. также itemEditorFactory().
[override virtual] void QStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Переопределяет: QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const.
Получает данные из виджета editor и сохраняет их в указанной модели model по элементу index.
Реализация по умолчанию получает значение для сохранения в модели данных из пользовательского свойства виджета editor.
См. также QMetaProperty::isUser().
[override virtual] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределяет: QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const.
Возвращает размер, необходимый делегату для отображения элемента, указанного индексом index, с учетом информации о стиле, предоставленной option.
Данная функция использует виджет QStyle для определения размера элемента.
См. также QStyle::sizeFromContents() и QStyle::CT_ItemViewItem.
[override virtual] void QStyledItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределяет: 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/qstyleditemdelegate.html