From 6880b7c39b2c7474be1c9adcabbe0b7d6596822f Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Mon, 21 Mar 2022 14:13:26 +0100 Subject: Itemviews: start fixing mixups of int/enum for Qt's item roles A model is supposed to return a Qt::CheckState for a CheckStateRole, and a Qt::Alignment for a Qt::TextAlignmentRole. This is what the documentation says (and what makes sense), but unfortunately Qt's default delegate expected a plain `int` instead. This sometimes worked (via QVariant conversions, e.g. when using a plain enum) and sometimes didn't (e.g. when using a flag type). This is confusing for end-users (and type unsafe, killing the whole point of using enums and flags in the first place). Adding some automatic flags<->int conversions through QVariant is frowned upon, so I don't want to go there. Instead, add some private convenience functions that extract either the right type from a variant, or try to extract an `int` and convert it to the expected type. Use these from within itemviews code. Change-Id: I44bee98c4a26a1ef6c3b2fa1b8de2edfee7aef32 Pick-to: 6.2 6.3 Fixes: QTBUG-75172 Task-number: QTBUG-74639 Reviewed-by: David Faure Reviewed-by: Richard Moe Gustavsen Reviewed-by: Volker Hilsheimer --- src/widgets/itemviews/qabstractitemdelegate_p.h | 3 +++ src/widgets/itemviews/qheaderview.cpp | 7 ++++--- src/widgets/itemviews/qitemdelegate.cpp | 7 ++++--- src/widgets/itemviews/qstyleditemdelegate.cpp | 7 ++++--- 4 files changed, 15 insertions(+), 9 deletions(-) (limited to 'src/widgets/itemviews') diff --git a/src/widgets/itemviews/qabstractitemdelegate_p.h b/src/widgets/itemviews/qabstractitemdelegate_p.h index da76d31e8b..fc0aa9a73f 100644 --- a/src/widgets/itemviews/qabstractitemdelegate_p.h +++ b/src/widgets/itemviews/qabstractitemdelegate_p.h @@ -55,6 +55,9 @@ #include "qabstractitemdelegate.h" #include +#include +#include + QT_REQUIRE_CONFIG(itemviews); QT_BEGIN_NAMESPACE diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 27866ecbb0..8fc0df84e2 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -60,6 +60,7 @@ #endif #include #include +#include #ifndef QT_NO_DATASTREAM #include @@ -2936,9 +2937,9 @@ void QHeaderView::initStyleOptionForIndex(QStyleOptionHeader *option, int logica Qt::TextAlignmentRole); opt.section = logicalIndex; opt.state |= state; - opt.textAlignment = Qt::Alignment(textAlignment.isValid() - ? Qt::Alignment(textAlignment.toInt()) - : d->defaultAlignment); + opt.textAlignment = textAlignment.isValid() + ? QtPrivate::legacyFlagValueFromModelData(textAlignment) + : d->defaultAlignment; opt.iconAlignment = Qt::AlignVCenter; opt.text = d->model->headerData(logicalIndex, d->orientation, diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index 2640d7163d..e481dcae72 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -432,7 +433,7 @@ void QItemDelegate::paint(QPainter *painter, Qt::CheckState checkState = Qt::Unchecked; value = index.data(Qt::CheckStateRole); if (value.isValid()) { - checkState = static_cast(value.toInt()); + checkState = QtPrivate::legacyEnumValueFromModelData(value); checkRect = doCheck(opt, opt.rect, value); } @@ -1182,7 +1183,7 @@ bool QItemDelegate::editorEvent(QEvent *event, return false; } - Qt::CheckState state = static_cast(value.toInt()); + Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData(value); if (flags & Qt::ItemIsUserTristate) state = ((Qt::CheckState)((state + 1) % 3)); else @@ -1209,7 +1210,7 @@ QStyleOptionViewItem QItemDelegate::setOptions(const QModelIndex &index, // set text alignment value = index.data(Qt::TextAlignmentRole); if (value.isValid()) - opt.displayAlignment = Qt::Alignment(value.toInt()); + opt.displayAlignment = QtPrivate::legacyFlagValueFromModelData(value); // set foreground brush value = index.data(Qt::ForegroundRole); diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index ddf706c0e6..6379031f6a 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -302,7 +303,7 @@ void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, value = modelRoleDataSpan.dataForRole(Qt::TextAlignmentRole); if (value->isValid() && !value->isNull()) - option->displayAlignment = Qt::Alignment(value->toInt()); + option->displayAlignment = QtPrivate::legacyFlagValueFromModelData(*value); value = modelRoleDataSpan.dataForRole(Qt::ForegroundRole); if (value->canConvert()) @@ -311,7 +312,7 @@ void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, value = modelRoleDataSpan.dataForRole(Qt::CheckStateRole); if (value->isValid() && !value->isNull()) { option->features |= QStyleOptionViewItem::HasCheckIndicator; - option->checkState = static_cast(value->toInt()); + option->checkState = QtPrivate::legacyEnumValueFromModelData(*value); } value = modelRoleDataSpan.dataForRole(Qt::DecorationRole); @@ -633,7 +634,7 @@ bool QStyledItemDelegate::editorEvent(QEvent *event, return false; } - Qt::CheckState state = static_cast(value.toInt()); + Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData(value); if (flags & Qt::ItemIsUserTristate) state = ((Qt::CheckState)((state + 1) % 3)); else -- cgit v1.2.3