From 3eb0c8007c9a8423a8c3476c3c1091c284bb2e52 Mon Sep 17 00:00:00 2001 From: Santhosh Kumar Date: Mon, 29 Apr 2024 12:03:21 +0200 Subject: [PATCH] Fix progress bar rendering issue when using windows 11 style The Windows 11 style checks for QProgressBar type and gets the respective orientation required for rendering. This creates an issue when we use QStyleItemDelegate as it's not QProgressBar type. This patch removes that condition and gets the orientation information through the style option similar to Windows Vista style. Fixes: QTBUG-124447 Change-Id: Ic2b36d79d7af017262e44dd2800ad45fbe63f8f2 Reviewed-by: Volker Hilsheimer --- .../styles/modernwindows/qwindows11style.cpp | 115 +++++++++--------- 1 file changed, 56 insertions(+), 59 deletions(-) diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index a55193e5ab5..0eff10d50af 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -1207,75 +1207,72 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op break; case QStyle::CE_ProgressBarGroove:{ if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast(option)) { - if (const QProgressBar* bar = qobject_cast(widget)) { - QRect rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); - QPointF center = rect.center(); - if (bar->orientation() & Qt::Horizontal) { - rect.setHeight(1); - rect.moveTop(center.y()); - } else { - rect.setWidth(1); - rect.moveLeft(center.x()); - } - painter->setPen(Qt::NoPen); - painter->setBrush(Qt::gray); - painter->drawRect(rect); + QRect rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); + QPointF center = rect.center(); + if (progbaropt->state & QStyle::State_Horizontal) { + rect.setHeight(1); + rect.moveTop(center.y()); + } else { + rect.setWidth(1); + rect.moveLeft(center.x()); } + painter->setPen(Qt::NoPen); + painter->setBrush(Qt::gray); + painter->drawRect(rect); } break; } case QStyle::CE_ProgressBarContents: if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast(option)) { - if (const QProgressBar* bar = qobject_cast(widget)) { - const qreal progressBarThickness = 3; - const qreal progressBarHalfThickness = progressBarThickness / 2.0; - QRectF rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); - QRectF originalRect = rect; - QPointF center = rect.center(); - bool isIndeterminate = progbaropt->maximum == 0 && progbaropt->minimum == 0; - float fillPercentage = 0; - const qreal offset = (bar->orientation() == Qt::Horizontal && int(rect.height()) % 2 == 0) - || (bar->orientation() == Qt::Vertical && int(rect.width()) % 2 == 0) ? 0.5 : 0.0; + const qreal progressBarThickness = 3; + const qreal progressBarHalfThickness = progressBarThickness / 2.0; + QRectF rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); + QRectF originalRect = rect; + QPointF center = rect.center(); + bool isIndeterminate = progbaropt->maximum == 0 && progbaropt->minimum == 0; + float fillPercentage = 0; + const Qt::Orientation orientation = (progbaropt->state & QStyle::State_Horizontal) ? Qt::Horizontal : Qt::Vertical; + const qreal offset = (orientation == Qt::Horizontal && int(rect.height()) % 2 == 0) + || (orientation == Qt::Vertical && int(rect.width()) % 2 == 0) ? 0.5 : 0.0; - if (!isIndeterminate) { - fillPercentage = ((float(progbaropt->progress) - float(progbaropt->minimum)) / (float(progbaropt->maximum) - float(progbaropt->minimum))); - if (bar->orientation() == Qt::Horizontal) { - rect.setHeight(progressBarThickness); - rect.moveTop(center.y() - progressBarHalfThickness - offset); - rect.setWidth(rect.width() * fillPercentage); - } else { - float oldHeight = rect.height(); - rect.setWidth(progressBarThickness); - rect.moveLeft(center.x() - progressBarHalfThickness - offset); - rect.moveTop(oldHeight * (1.0f - fillPercentage)); - rect.setHeight(oldHeight * fillPercentage); - } + if (!isIndeterminate) { + fillPercentage = ((float(progbaropt->progress) - float(progbaropt->minimum)) / (float(progbaropt->maximum) - float(progbaropt->minimum))); + if (orientation == Qt::Horizontal) { + rect.setHeight(progressBarThickness); + rect.moveTop(center.y() - progressBarHalfThickness - offset); + rect.setWidth(rect.width() * fillPercentage); } else { - auto elapsedTime = std::chrono::time_point_cast(std::chrono::system_clock::now()); - fillPercentage = (elapsedTime.time_since_epoch().count() % 5000)/(5000.0f*0.75); - if (bar->orientation() == Qt::Horizontal) { - float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.width(), float(rect.width())); - float barEnd = qMin(fillPercentage * rect.width(), float(rect.width())); - rect = QRect(QPoint(rect.left() + barBegin, rect.top()), QPoint(rect.left() + barEnd, rect.bottom())); - rect.setHeight(progressBarThickness); - rect.moveTop(center.y() - progressBarHalfThickness - offset); - } else { - float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.height(), float(rect.height())); - float barEnd = qMin(fillPercentage * rect.height(), float(rect.height())); - rect = QRect(QPoint(rect.left(), rect.bottom() - barEnd), QPoint(rect.right(), rect.bottom() - barBegin)); - rect.setWidth(progressBarThickness); - rect.moveLeft(center.x() - progressBarHalfThickness - offset); - } - const_cast(widget)->update(); + float oldHeight = rect.height(); + rect.setWidth(progressBarThickness); + rect.moveLeft(center.x() - progressBarHalfThickness - offset); + rect.moveTop(oldHeight * (1.0f - fillPercentage)); + rect.setHeight(oldHeight * fillPercentage); } - if (progbaropt->invertedAppearance && bar->orientation() == Qt::Horizontal) - rect.moveLeft(originalRect.width() * (1.0 - fillPercentage)); - else if (progbaropt->invertedAppearance && bar->orientation() == Qt::Vertical) - rect.moveBottom(originalRect.height() * fillPercentage); - painter->setPen(Qt::NoPen); - painter->setBrush(progbaropt->palette.accent()); - painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); + } else { + auto elapsedTime = std::chrono::time_point_cast(std::chrono::system_clock::now()); + fillPercentage = (elapsedTime.time_since_epoch().count() % 5000)/(5000.0f*0.75); + if (orientation == Qt::Horizontal) { + float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.width(), float(rect.width())); + float barEnd = qMin(fillPercentage * rect.width(), float(rect.width())); + rect = QRect(QPoint(rect.left() + barBegin, rect.top()), QPoint(rect.left() + barEnd, rect.bottom())); + rect.setHeight(progressBarThickness); + rect.moveTop(center.y() - progressBarHalfThickness - offset); + } else { + float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.height(), float(rect.height())); + float barEnd = qMin(fillPercentage * rect.height(), float(rect.height())); + rect = QRect(QPoint(rect.left(), rect.bottom() - barEnd), QPoint(rect.right(), rect.bottom() - barBegin)); + rect.setWidth(progressBarThickness); + rect.moveLeft(center.x() - progressBarHalfThickness - offset); + } + const_cast(widget)->update(); } + if (progbaropt->invertedAppearance && orientation == Qt::Horizontal) + rect.moveLeft(originalRect.width() * (1.0 - fillPercentage)); + else if (progbaropt->invertedAppearance && orientation == Qt::Vertical) + rect.moveBottom(originalRect.height() * fillPercentage); + painter->setPen(Qt::NoPen); + painter->setBrush(progbaropt->palette.accent()); + painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); } break; case QStyle::CE_ProgressBarLabel: