diff options
Diffstat (limited to 'src/quick/items/qquickrectangle.cpp')
-rw-r--r-- | src/quick/items/qquickrectangle.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/quick/items/qquickrectangle.cpp b/src/quick/items/qquickrectangle.cpp index 5e217dcd0c..f3cefc7463 100644 --- a/src/quick/items/qquickrectangle.cpp +++ b/src/quick/items/qquickrectangle.cpp @@ -451,8 +451,30 @@ void QQuickRectangle::setGradient(const QJSValue &gradient) d->gradient = QJSValue(); } } else if (gradient.isNumber() || gradient.isString()) { - QGradient preset(gradient.toVariant().value<QGradient::Preset>()); - if (preset.type() != QGradient::NoGradient) { + static const QMetaEnum gradientPresetMetaEnum = QMetaEnum::fromType<QGradient::Preset>(); + Q_ASSERT(gradientPresetMetaEnum.isValid()); + + QGradient result; + + // This code could simply use gradient.toVariant().convert<QGradient::Preset>(), + // but QTBUG-76377 prevents us from doing error checks. So we need to + // do them manually. Also, NumPresets cannot be used. + + if (gradient.isNumber()) { + const auto preset = QGradient::Preset(gradient.toInt()); + if (preset != QGradient::NumPresets && gradientPresetMetaEnum.valueToKey(preset)) + result = QGradient(preset); + } else if (gradient.isString()) { + const auto presetName = gradient.toString(); + if (presetName != QLatin1String("NumPresets")) { + bool ok; + const auto presetInt = gradientPresetMetaEnum.keyToValue(qPrintable(presetName), &ok); + if (ok) + result = QGradient(QGradient::Preset(presetInt)); + } + } + + if (result.type() != QGradient::NoGradient) { d->gradient = gradient; } else { qmlWarning(this) << "No such gradient preset '" << gradient.toString() << "'"; |