diff options
Diffstat (limited to 'src/widgets/dialogs/qprogressdialog.cpp')
-rw-r--r-- | src/widgets/dialogs/qprogressdialog.cpp | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp index 59d44cd8d5..9761bcc828 100644 --- a/src/widgets/dialogs/qprogressdialog.cpp +++ b/src/widgets/dialogs/qprogressdialog.cpp @@ -17,15 +17,20 @@ #include "qelapsedtimer.h" #include "qscopedvaluerollback.h" #include <private/qdialog_p.h> + +#include <QtCore/qpointer.h> + #include <limits.h> +using namespace std::chrono_literals; + QT_BEGIN_NAMESPACE // If the operation is expected to take this long (as predicted by // progress time), show the progress dialog. -static const int defaultShowTime = 4000; +static constexpr auto defaultShowTime = 4000ms; // Wait at least this long before attempting to make a prediction. -static const int minWaitTime = 50; +static constexpr auto minWaitTime = 50ms; class QProgressDialogPrivate : public QDialogPrivate { @@ -52,7 +57,7 @@ public: QPointer<QObject> receiverToDisconnectOnClose; QElapsedTimer starttime; QByteArray memberToDisconnectOnClose; - int showTime = defaultShowTime; + std::chrono::milliseconds showTime = defaultShowTime; bool processingEvents = false; bool shownOnce = false; bool autoClose = true; @@ -192,10 +197,11 @@ void QProgressDialogPrivate::_q_disconnectOnClose() A modeless progress dialog is suitable for operations that take place in the background, where the user is able to interact with the - application. Such operations are typically based on QTimer (or - QObject::timerEvent()) or QSocketNotifier; or performed - in a separate thread. A QProgressBar in the status bar of your main window - is often an alternative to a modeless progress dialog. + application. Such operations are typically based on a timer class, + such as QChronoTimer (or the more low-level QObject::timerEvent()) or + QSocketNotifier; or performed in a separate thread. A QProgressBar in + the status bar of your main window is often an alternative to a modeless + progress dialog. You need to have an event loop to be running, connect the canceled() signal to a slot that stops the operation, and call \l @@ -215,7 +221,7 @@ void QProgressDialogPrivate::_q_disconnectOnClose() \image fusion-progressdialog.png A progress dialog shown in the Fusion widget style. - \sa QDialog, QProgressBar, {Pixelator Example} + \sa QDialog, QProgressBar */ @@ -625,23 +631,22 @@ void QProgressDialog::setValue(int progress) return; } else { d->setValueCalled = true; - bool need_show; - int elapsed = d->starttime.elapsed(); + bool need_show = false; + using namespace std::chrono; + nanoseconds elapsed = d->starttime.durationElapsed(); if (elapsed >= d->showTime) { need_show = true; } else { if (elapsed > minWaitTime) { - int estimate; - int totalSteps = maximum() - minimum(); - int myprogress = progress - minimum(); - if (myprogress == 0) myprogress = 1; - if ((totalSteps - myprogress) >= INT_MAX / elapsed) - estimate = (totalSteps - myprogress) / myprogress * elapsed; + const int totalSteps = maximum() - minimum(); + const int myprogress = std::max(progress - minimum(), 1); + const int remainingSteps = totalSteps - myprogress; + nanoseconds estimate; + if (remainingSteps >= INT_MAX / elapsed.count()) + estimate = (remainingSteps / myprogress) * elapsed; else - estimate = elapsed * (totalSteps - myprogress) / myprogress; + estimate = (elapsed * remainingSteps) / myprogress; need_show = estimate >= d->showTime; - } else { - need_show = false; } } if (need_show) { @@ -717,17 +722,18 @@ void QProgressDialog::changeEvent(QEvent *ev) void QProgressDialog::setMinimumDuration(int ms) { Q_D(QProgressDialog); - d->showTime = ms; + std::chrono::milliseconds msecs{ms}; + d->showTime = msecs; if (d->bar->value() == d->bar->minimum()) { d->forceTimer->stop(); - d->forceTimer->start(ms); + d->forceTimer->start(msecs); } } int QProgressDialog::minimumDuration() const { Q_D(const QProgressDialog); - return d->showTime; + return int(d->showTime.count()); } @@ -743,7 +749,7 @@ void QProgressDialog::closeEvent(QCloseEvent *e) /*! \property QProgressDialog::autoReset - \brief whether the progress dialog calls reset() as soon as value() equals maximum() + \brief whether the progress dialog calls reset() as soon as value() equals maximum(). The default is true. |