Класс QStyledItemDelegate
Класс QStyledItemDelegate предоставляет средства для отображения и редактирования элементов данных из модели. Подробнее...
| Заголовок: | #include <QStyledItemDelegate> |
| qmake: | QT += widgets |
| С версии: | Qt 4.4 |
| Наследует: | QAbstractItemDelegate |
Открытые функции
| 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 |
- 9 открытых функций, унаследованных от QAbstractItemDelegate
- 34 открытых функции, унаследованных от QObject
Защищённые функции
| виртуальный 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 |
- 9 защищённых функций, унаследованных от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 открытый слот, унаследованный от QObject
- 3 сигнала, унаследованные от QAbstractItemDelegate
- 2 сигнала, унаследованные от QObject
- 1 открытая переменная, унаследованная от QObject
- 10 статические открытые члены, унаследованные от QObject
- 2 защищённые переменные, унаследованные от QObject
Подробное описание
Класс QStyledItemDelegate предоставляет средства для отображения и редактирования элементов данных из модели.
При отображении данных из моделей в виджетах списка Qt, например, QTableView, отдельные элементы рисуются делегатом. Также, при редактировании элемента, он предоставляет виджет редактора, который размещается поверх виджета списка во время редактирования. QStyledItemDelegate является делегатом по умолчанию для всех виджетов списка Qt и устанавливается на них при их создании.
Класс 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.
END_OF_DOCUMENT_MARKER ```Если вы хотите изменить какие-либо ограничивающие прямоугольники, вычисленные стилем или отрисовку индикаторов флажков, вы можете наследовать от QStyle. Однако обратите внимание, что размер элементов также может быть изменён путём переопределения sizeHint().
Возможно, что пользовательский делегат предоставляет редакторы без использования фабрики элементов редактора. В этом случае необходимо переопределить следующие виртуальные функции:
- createEditor() возвращает виджет, используемый для изменения данных из модели, и может быть переопределён для настройки поведения редактирования.
- setEditorData() предоставляет виджету данные для обработки.
- updateEditorGeometry() обеспечивает корректное отображение редактора относительно представления элементов.
- setModelData() возвращает обновлённые данные модели.
Пример Star Delegate создаёт редакторы, переопределяя эти методы.
QStyledItemDelegate vs. 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().
Возвращает виджет, используемый для редактирования элемента, указанного 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().
[override virtual protected] bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event)
Переопределено из QObject::eventFilter().
Возвращает true если данный editor является допустимым QWidget и данный event обрабатывается; в противном случае возвращает false. По умолчанию обрабатываются следующие события нажатия клавиш:
- Tab
- Backtab
- Enter
- Return
- Esc
Если тип editor — QTextEdit или QPlainTextEdit, то клавиши Enter и Return не обрабатываются.
В случае нажатия клавиш Tab, Backtab, Enter и Return данные editor сохраняются в модели, и редактор закрывается. Если event — нажатие клавиши Tab, представление откроет редактор для следующего элемента в представлении. Аналогично, если event — нажатие клавиши 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().
Отображает делегат с помощью указанного painter и стиля option для элемента, указанного index.
Эта функция рисует элемент с помощью QStyle представления.
При переопределении функции paint в подклассе. Используйте initStyleOption() для настройки option таким же образом, как и в QStyledItemDelegate.
По возможности используйте option при отрисовке. Особенно переменную rect, чтобы определить, где рисовать, и переменную state, чтобы определить, включён ли он или выбран.
После отрисовки убедитесь, что отрисовщик возвращён в состояние, в котором он был предоставлен при вызове этой функции. Например, может быть полезно вызвать QPainter::save() перед отрисовкой и QPainter::restore() после неё.
См. также QItemDelegate::paint(), QStyle::drawControl() и QStyle::CE_ItemViewItem.
[override virtual] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Переопределено из QAbstractItemDelegate::setEditorData().
Устанавливает данные для отображения и редактирования в 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().
Получает данные из виджета editor и сохраняет их в указанном model в элементе index.
В реализации по умолчанию значение для сохранения в модели данных извлекается из пользовательского свойства виджета editor.
См. также QMetaProperty::isUser().
[override virtual] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределено из QAbstractItemDelegate::sizeHint().
Возвращает размер, необходимый делегату для отображения элемента, указанного index, с учётом стилистической информации, предоставленной option.
Для определения размера элемента используется QStyle представления.
См. также QStyle::sizeFromContents() и QStyle::CT_ItemViewItem.
[override virtual] void QStyledItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Переопределено из QAbstractItemDelegate::updateEditorGeometry().
Обновляет виджет editor для элемента, указанного index, в соответствии с заданным стилем option.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qstyleditemdelegate.html