252void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option,
253 const QModelIndex &index)
const
255 option->index = index;
257 Q_D(
const QStyledItemDelegate);
258 QModelRoleDataSpan modelRoleDataSpan = d->modelRoleData;
259 index.multiData(modelRoleDataSpan);
261 const QVariant *value;
262 value = modelRoleDataSpan.dataForRole(Qt::FontRole);
263 if (value->isValid() && !value->isNull()) {
264 option->font = qvariant_cast<QFont>(*value).resolve(option->font);
265 option->fontMetrics = QFontMetrics(option->font);
268 value = modelRoleDataSpan.dataForRole(Qt::TextAlignmentRole);
269 if (value->isValid() && !value->isNull())
270 option->displayAlignment = QtPrivate::legacyFlagValueFromModelData<Qt::Alignment>(*value);
272 value = modelRoleDataSpan.dataForRole(Qt::ForegroundRole);
273 if (value->canConvert<QBrush>())
274 option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(*value));
276 value = modelRoleDataSpan.dataForRole(Qt::CheckStateRole);
277 if (value->isValid() && !value->isNull()) {
278 option->features |= QStyleOptionViewItem::HasCheckIndicator;
279 option->checkState = QtPrivate::legacyEnumValueFromModelData<Qt::CheckState>(*value);
282 value = modelRoleDataSpan.dataForRole(Qt::DecorationRole);
283 if (value->isValid() && !value->isNull()) {
284 option->features |= QStyleOptionViewItem::HasDecoration;
285 switch (value->userType()) {
286 case QMetaType::QIcon: {
287 option->icon = qvariant_cast<QIcon>(*value);
288 if (option->icon.isNull()) {
289 option->features &= ~QStyleOptionViewItem::HasDecoration;
293 if (!(option->state & QStyle::State_Enabled))
294 mode = QIcon::Disabled;
295 else if (option->state & QStyle::State_Selected)
296 mode = QIcon::Selected;
298 mode = QIcon::Normal;
299 QIcon::State state = option->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
300 QSize actualSize = option->icon.actualSize(option->decorationSize, mode, state);
302 option->decorationSize = QSize(qMin(option->decorationSize.width(), actualSize.width()),
303 qMin(option->decorationSize.height(), actualSize.height()));
306 case QMetaType::QColor: {
307 QPixmap pixmap(option->decorationSize);
308 pixmap.fill(qvariant_cast<QColor>(*value));
309 option->icon = QIcon(pixmap);
312 case QMetaType::QImage: {
313 QImage image = qvariant_cast<QImage>(*value);
314 option->icon = QIcon(QPixmap::fromImage(image));
315 option->decorationSize = image.deviceIndependentSize().toSize();
318 case QMetaType::QPixmap: {
319 QPixmap pixmap = qvariant_cast<QPixmap>(*value);
320 option->icon = QIcon(pixmap);
321 option->decorationSize = pixmap.deviceIndependentSize().toSize();
329 value = modelRoleDataSpan.dataForRole(Qt::DisplayRole);
330 if (value->isValid() && !value->isNull()) {
331 option->features |= QStyleOptionViewItem::HasDisplay;
332 option->text = displayText(*value, option->locale);
335 value = modelRoleDataSpan.dataForRole(Qt::BackgroundRole);
336 option->backgroundBrush = qvariant_cast<QBrush>(*value);
339 option->styleObject =
nullptr;
364void QStyledItemDelegate::paint(QPainter *painter,
365 const QStyleOptionViewItem &option,
const QModelIndex &index)
const
367 Q_ASSERT(index.isValid());
369 QStyleOptionViewItem opt = option;
370 initStyleOption(&opt, index);
372 const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
373 QStyle *style = widget ? widget->style() : QApplication::style();
374 style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
387QSize QStyledItemDelegate::sizeHint(
const QStyleOptionViewItem &option,
388 const QModelIndex &index)
const
390 QVariant value = index.data(Qt::SizeHintRole);
392 return qvariant_cast<QSize>(value);
394 QStyleOptionViewItem opt = option;
395 initStyleOption(&opt, index);
396 const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
397 QStyle *style = widget ? widget->style() : QApplication::style();
398 return style->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), widget);
450void QStyledItemDelegate::setModelData(QWidget *editor,
451 QAbstractItemModel *model,
452 const QModelIndex &index)
const
454 Q_D(
const QStyledItemDelegate);
457 QByteArray n = editor->metaObject()->userProperty().name();
459 n = d->editorFactory()->valuePropertyName(
460 model->data(index, Qt::EditRole).userType());
462 model->setData(index, editor->property(n), Qt::EditRole);
469void QStyledItemDelegate::updateEditorGeometry(QWidget *editor,
470 const QStyleOptionViewItem &option,
471 const QModelIndex &index)
const
475 Q_ASSERT(index.isValid());
476 const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
478 QStyleOptionViewItem opt = option;
479 initStyleOption(&opt, index);
480 opt.showDecorationSelected = editor->style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected,
nullptr, editor);
482 QStyle *style = widget ? widget->style() : QApplication::style();
483 QRect geom = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, widget);
484 editor->setGeometry(geom);
525bool QStyledItemDelegate::editorEvent(QEvent *event,
526 QAbstractItemModel *model,
527 const QStyleOptionViewItem &option,
528 const QModelIndex &index)
534 Qt::ItemFlags flags = model->flags(index);
535 if (!(flags & Qt::ItemIsUserCheckable) || !(option.state & QStyle::State_Enabled)
536 || !(flags & Qt::ItemIsEnabled))
540 QVariant value = index.data(Qt::CheckStateRole);
541 if (!value.isValid())
544 const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
545 QStyle *style = widget ? widget->style() : QApplication::style();
548 if ((event->type() == QEvent::MouseButtonRelease)
549 || (event->type() == QEvent::MouseButtonDblClick)
550 || (event->type() == QEvent::MouseButtonPress)) {
551 QStyleOptionViewItem viewOpt(option);
552 initStyleOption(&viewOpt, index);
553 QRect checkRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, widget);
554 QMouseEvent *me =
static_cast<QMouseEvent*>(event);
555 if (me->button() != Qt::LeftButton || !checkRect.contains(me->position().toPoint()))
558 if ((event->type() == QEvent::MouseButtonPress)
559 || (event->type() == QEvent::MouseButtonDblClick))
562 }
else if (event->type() == QEvent::KeyPress) {
563 if (
static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space
564 &&
static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select)
570 Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData<Qt::CheckState>(value);
571 if (flags & Qt::ItemIsUserTristate)
572 state = ((Qt::CheckState)((state + 1) % 3));
574 state = (state == Qt::Checked) ? Qt::Unchecked : Qt::Checked;
575 return model->setData(index, state, Qt::CheckStateRole);