97void QProgressBar::initStyleOption(QStyleOptionProgressBar *option)
const
101 Q_D(
const QProgressBar);
102 option->initFrom(
this);
104 if (d->orientation == Qt::Horizontal)
105 option->state |= QStyle::State_Horizontal;
106 option->minimum = d->minimum;
107 option->maximum = d->maximum;
108 option->progress = d->value;
109 option->textAlignment = d->alignment;
110 option->textVisible = d->textVisible;
111 option->text = text();
112 option->invertedAppearance = d->invertedAppearance;
113 option->bottomToTop = d->textDirection == QProgressBar::BottomToTop;
118 Q_Q(
const QProgressBar);
129 const int currentPercentage = totalSteps ? (
value -
minimum) * 100 / totalSteps : 0;
133 const int percentageChangeConstant = 1;
134 const bool percentageChanged = (qAbs(currentPercentage - lastPaintedPercentage) >= percentageChangeConstant);
137 if (format.contains(
"%v"_L1))
139 if (format.contains(
"%p"_L1) && percentageChanged)
144 QStyleOptionProgressBar opt;
145 q->initStyleOption(&opt);
146 QRect groove = q->style()->subElementRect(QStyle::SE_ProgressBarGroove, &opt, q);
147 int grooveBlock = (q->orientation() == Qt::Horizontal) ? groove.width() : groove.height();
148 const double pixelSize =
static_cast<
double>(totalSteps) / grooveBlock;
149 return valueDifference > pixelSize;
290void QProgressBar::setValue(
int value)
293 if (d->value == value
294 || ((value > d->maximum || value < d->minimum)
295 && (d->maximum != 0 || d->minimum != 0)))
298 emit valueChanged(value);
299#if QT_CONFIG(accessibility)
301 QAccessibleValueChangeEvent event(
this, value);
302 QAccessible::updateAccessibility(&event);
305 if (d->repaintRequired())
384void QProgressBar::paintEvent(QPaintEvent *)
386 QStylePainter paint(
this);
387 QStyleOptionProgressBar opt;
388 initStyleOption(&opt);
389 paint.drawControl(QStyle::CE_ProgressBar, opt);
390 d_func()->lastPaintedValue = d_func()->value;
396QSize QProgressBar::sizeHint()
const
399 QFontMetrics fm = fontMetrics();
400 QStyleOptionProgressBar opt;
401 initStyleOption(&opt);
402 int cw = style()->pixelMetric(QStyle::PM_ProgressBarChunkWidth, &opt,
this);
403 QSize size = QSize(qMax(9, cw) * 7 + fm.horizontalAdvance(u'0') * 4, fm.height() + 8);
404 if (!(opt.state & QStyle::State_Horizontal))
405 size = size.transposed();
406 return style()->sizeFromContents(QStyle::CT_ProgressBar, &opt, size,
this);
412QSize QProgressBar::minimumSizeHint()
const
415 if (orientation() == Qt::Horizontal)
416 size = QSize(sizeHint().width(), fontMetrics().height() + 2);
418 size = QSize(fontMetrics().height() + 2, sizeHint().height());
437QString QProgressBar::text()
const
439 Q_D(
const QProgressBar);
440 if ((d->maximum == 0 && d->minimum == 0) || d->value < d->minimum
441 || (d->value == INT_MIN && d->minimum == INT_MIN))
444 qint64 totalSteps = qint64(d->maximum) - d->minimum;
446 QString result = d->format;
447 QLocale locale = d->locale;
448 locale.setNumberOptions(locale.numberOptions() | QLocale::OmitGroupSeparator);
449 result.replace(
"%m"_L1, locale.toString(totalSteps));
450 result.replace(
"%v"_L1, locale.toString(d->value));
455 if (totalSteps == 0) {
456 result.replace(
"%p"_L1, locale.toString(100));
460 const auto progress =
static_cast<
int>((qint64(d->value) - d->minimum) * 100.0 / totalSteps);
461 result.replace(
"%p"_L1, locale.toString(progress));
476void QProgressBar::setOrientation(Qt::Orientation orientation)
479 if (d->orientation == orientation)
481 d->orientation = orientation;
482 if (!testAttribute(Qt::WA_WState_OwnSizePolicy)) {
483 setSizePolicy(sizePolicy().transposed());
484 setAttribute(Qt::WA_WState_OwnSizePolicy,
false);
486 d->resetLayoutItemMargins();