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: Jan Arve Sæther <jan-arve.saether@qt.io> (cherry picked from commit 8f283aa2997975f94c9e214064855553b4a6ee48) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
aa6d59deee
commit
35afe09b03
@ -1207,10 +1207,9 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
|
||||
break;
|
||||
case QStyle::CE_ProgressBarGroove:{
|
||||
if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast<const QStyleOptionProgressBar*>(option)) {
|
||||
if (const QProgressBar* bar = qobject_cast<const QProgressBar*>(widget)) {
|
||||
QRect rect = subElementRect(SE_ProgressBarContents, progbaropt, widget);
|
||||
QPointF center = rect.center();
|
||||
if (bar->orientation() & Qt::Horizontal) {
|
||||
if (progbaropt->state & QStyle::State_Horizontal) {
|
||||
rect.setHeight(1);
|
||||
rect.moveTop(center.y());
|
||||
} else {
|
||||
@ -1221,12 +1220,10 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
|
||||
painter->setBrush(Qt::gray);
|
||||
painter->drawRect(rect);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QStyle::CE_ProgressBarContents:
|
||||
if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast<const QStyleOptionProgressBar*>(option)) {
|
||||
if (const QProgressBar* bar = qobject_cast<const QProgressBar*>(widget)) {
|
||||
const qreal progressBarThickness = 3;
|
||||
const qreal progressBarHalfThickness = progressBarThickness / 2.0;
|
||||
QRectF rect = subElementRect(SE_ProgressBarContents, progbaropt, widget);
|
||||
@ -1234,12 +1231,13 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
|
||||
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 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) {
|
||||
if (orientation == Qt::Horizontal) {
|
||||
rect.setHeight(progressBarThickness);
|
||||
rect.moveTop(center.y() - progressBarHalfThickness - offset);
|
||||
rect.setWidth(rect.width() * fillPercentage);
|
||||
@ -1253,7 +1251,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
|
||||
} else {
|
||||
auto elapsedTime = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
|
||||
fillPercentage = (elapsedTime.time_since_epoch().count() % 5000)/(5000.0f*0.75);
|
||||
if (bar->orientation() == Qt::Horizontal) {
|
||||
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()));
|
||||
@ -1268,15 +1266,14 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
|
||||
}
|
||||
const_cast<QWidget*>(widget)->update();
|
||||
}
|
||||
if (progbaropt->invertedAppearance && bar->orientation() == Qt::Horizontal)
|
||||
if (progbaropt->invertedAppearance && orientation == Qt::Horizontal)
|
||||
rect.moveLeft(originalRect.width() * (1.0 - fillPercentage));
|
||||
else if (progbaropt->invertedAppearance && bar->orientation() == Qt::Vertical)
|
||||
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:
|
||||
if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast<const QStyleOptionProgressBar*>(option)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user