📄 q3progressdialog.cpp
字号:
}/*! Sets the cancel button to the push button, \a cancelButton. The progress dialog takes ownership of this button which will be deleted when necessary, so do not pass the address of an object that is on the stack, i.e. use new() to create the button. \sa setCancelButtonText()*/void Q3ProgressDialog::setCancelButton(QPushButton *cancelButton){ delete d->cancel; d->cancel = cancelButton; if (cancelButton) { if (cancelButton->parentWidget() == this) { cancelButton->hide(); // until we resize } else { cancelButton->setParent(this, 0); } connect(d->cancel, SIGNAL(clicked()), this, SIGNAL(canceled())); new QShortcut(Qt::Key_Escape, this, SIGNAL(canceled())); } int w = qMax(isVisible() ? width() : 0, sizeHint().width()); int h = qMax(isVisible() ? height() : 0, sizeHint().height()); resize(w, h); if (cancelButton) cancelButton->show();}/*! Sets the cancel button's text to \a cancelButtonText. \sa setCancelButton()*/void Q3ProgressDialog::setCancelButtonText(const QString &cancelButtonText){ if (!cancelButtonText.isNull()) { if (d->cancel) d->cancel->setText(cancelButtonText); else setCancelButton(new QPushButton(cancelButtonText, this)); } else { setCancelButton(0); } int w = qMax(isVisible() ? width() : 0, sizeHint().width()); int h = qMax(isVisible() ? height() : 0, sizeHint().height()); resize(w, h);}/*! Sets the progress bar widget to \a bar. The progress dialog resizes to fit. The progress dialog takes ownership of the progress \a bar which will be deleted when necessary, so do not use a progress bar allocated on the stack.*/void Q3ProgressDialog::setBar(Q3ProgressBar *bar){#ifndef QT_NO_DEBUG if (progress() > 0) qWarning("Q3ProgressDialog::setBar: Cannot set a new progress bar " "while the old one is active");#endif delete d->bar; d->bar = bar; int w = qMax(isVisible() ? width() : 0, sizeHint().width()); int h = qMax(isVisible() ? height() : 0, sizeHint().height()); resize(w, h);}/*! \property Q3ProgressDialog::wasCanceled \brief whether the dialog was canceled \sa setProgress()*/bool Q3ProgressDialog::wasCanceled() const{ return d->cancellation_flag;}/*! \property Q3ProgressDialog::wasCancelled \brief whether the dialog was canceled \since 4.2 Use \l wasCanceled instead.*//*! Use wasCanceled() instead.*/bool Q3ProgressDialog::wasCancelled() const{ return d->cancellation_flag;}/*! \property Q3ProgressDialog::totalSteps \brief the total number of steps The default is 0.*/int Q3ProgressDialog::totalSteps() const{ if (d && d->bar) return bar()->totalSteps(); return 0;}void Q3ProgressDialog::setTotalSteps(int totalSteps){ bar()->setTotalSteps(totalSteps);}/*! Resets the progress dialog. The progress dialog becomes hidden if autoClose() is true. \sa setAutoClose(), setAutoReset()*/void Q3ProgressDialog::reset(){#ifndef QT_NO_CURSOR if (progress() >= 0) { if (d->creator) d->creator->setCursor(d->parentCursor); }#endif if (d->autoClose || d->forceHide) hide(); bar()->reset(); d->cancellation_flag = false; d->shown_once = false; forceTimer->stop();}/*! Resets the progress dialog. wasCanceled() becomes true until the progress dialog is reset. The progress dialog becomes hidden.*/void Q3ProgressDialog::cancel(){ d->forceHide = true; reset(); d->forceHide = false; d->cancellation_flag = true;}/*! \property Q3ProgressDialog::progress \brief the current amount of progress made. For the progress dialog to work as expected, you should initially set this property to 0 and finally set it to Q3ProgressDialog::totalSteps(); you can call setProgress() any number of times in-between. \warning If the progress dialog is modal (see Q3ProgressDialog::Q3ProgressDialog()), this function calls QApplication::processEvents(), so take care that this does not cause undesirable re-entrancy in your code. For example, don't use a Q3ProgressDialog inside a paintEvent()! \sa totalSteps*/int Q3ProgressDialog::progress() const{ return bar()->progress();}void Q3ProgressDialog::setProgress(int progress){ if (progress == bar()->progress() || bar()->progress() == -1 && progress == bar()->totalSteps()) return; bar()->setProgress(progress); if (d->shown_once) { if (isModal()) qApp->processEvents(); } else { if (progress == 0) {#ifndef QT_NO_CURSOR if (d->creator) { d->parentCursor = d->creator->cursor(); d->creator->setCursor(Qt::WaitCursor); }#endif d->starttime.start(); forceTimer->start(d->showTime); return; } else { bool need_show; int elapsed = d->starttime.elapsed(); if (elapsed >= d->showTime) { need_show = true; } else { if (elapsed > minWaitTime) { int estimate; if ((totalSteps() - progress) >= INT_MAX / elapsed) estimate = (totalSteps() - progress) / progress * elapsed; else estimate = elapsed * (totalSteps() - progress) / progress; need_show = estimate >= d->showTime; } else { need_show = false; } } if (need_show) { int w = qMax(isVisible() ? width() : 0, sizeHint().width()); int h = qMax(isVisible() ? height() : 0, sizeHint().height()); resize(w, h); show(); d->shown_once = true; } }#ifdef Q_WS_MAC QApplication::flush();#endif } if (progress == bar()->totalSteps() && d->autoReset) reset();}/*! \overload Sets the current amount of progress to \a progress and the total number of steps to \a totalSteps. \sa setTotalSteps()*/void Q3ProgressDialog::setProgress(int progress, int totalSteps){ setTotalSteps(totalSteps); setProgress(progress);}/*! Returns a size that fits the contents of the progress dialog. The progress dialog resizes itself as required, so you should not need to call this yourself.*/QSize Q3ProgressDialog::sizeHint() const{ QSize sh = label()->sizeHint(); QSize bh = bar()->sizeHint(); int h = margin_tb*2 + bh.height() + sh.height() + spacing; if (d->cancel) h += d->cancel->sizeHint().height() + spacing; return QSize(qMax(200, sh.width() + 2*margin_lr), h);}/*!\reimp*/void Q3ProgressDialog::resizeEvent(QResizeEvent *){ layout();}/*! \reimp*/void Q3ProgressDialog::changeEvent(QEvent *ev){ if(ev->type() == QEvent::StyleChange) layout(); QDialog::changeEvent(ev);}void Q3ProgressDialog::layout(){ int sp = spacing; int mtb = margin_tb; int mlr = qMin(width()/10, margin_lr); const bool centered = bool(style()->styleHint(QStyle::SH_ProgressDialog_CenterCancelButton, 0, this)); QSize cs = d->cancel ? d->cancel->sizeHint() : QSize(0,0); QSize bh = bar()->sizeHint(); int cspc; int lh = 0; // Find spacing and sizes that fit. It is important that a progress // dialog can be made very small if the user demands it so. for (int attempt=5; attempt--;) { cspc = d->cancel ? cs.height() + sp : 0; lh = qMax(0, height() - mtb - bh.height() - sp - cspc); if (lh < height()/4) { // Getting cramped sp /= 2; mtb /= 2; if (d->cancel) { cs.setHeight(qMax(4,cs.height()-sp-2)); } bh.setHeight(qMax(4,bh.height()-sp-1)); } else { break; } } if (d->cancel) { d->cancel->setGeometry( centered ? width()/2 - cs.width()/2 : width() - mlr - cs.width(), height() - mtb - cs.height() + sp, cs.width(), cs.height()); } label()->setGeometry(mlr, 0, width()-mlr*2, lh); bar()->setGeometry(mlr, lh+sp, width()-mlr*2, bh.height());}/*! \property Q3ProgressDialog::minimumDuration \brief the time that must pass before the dialog appears If the expected duration of the task is less than the minimumDuration, the dialog will not appear at all. This prevents the dialog popping up for tasks that are quickly over. For tasks that are expected to exceed the minimumDuration, the dialog will pop up after the minimumDuration time or as soon as any progress is set. If set to 0, the dialog is always shown as soon as any progress is set. The default is 4000 milliseconds.*/void Q3ProgressDialog::setMinimumDuration(int ms){ d->showTime = ms; if (bar()->progress() == 0) { forceTimer->stop(); forceTimer->start(ms); }}int Q3ProgressDialog::minimumDuration() const{ return d->showTime;}/*! \reimp*/void Q3ProgressDialog::closeEvent(QCloseEvent *e){ emit canceled(); QDialog::closeEvent(e);}/*! \property Q3ProgressDialog::autoReset \brief whether the progress dialog calls reset() as soon as progress() equals totalSteps() The default is true. \sa setAutoClose()*/void Q3ProgressDialog::setAutoReset(bool b){ d->autoReset = b;}bool Q3ProgressDialog::autoReset() const{ return d->autoReset;}/*! \property Q3ProgressDialog::autoClose \brief whether the dialog gets hidden by reset() The default is true. \sa setAutoReset()*/void Q3ProgressDialog::setAutoClose(bool b){ d->autoClose = b;}bool Q3ProgressDialog::autoClose() const{ return d->autoClose;}/*! \reimp*/void Q3ProgressDialog::showEvent(QShowEvent *e){ QDialog::showEvent(e); int w = qMax(isVisible() ? width() : 0, sizeHint().width()); int h = qMax(isVisible() ? height() : 0, sizeHint().height()); resize(w, h); forceTimer->stop();}/*! Shows the dialog if it is still hidden after the algorithm has been started and minimumDuration milliseconds have passed. \sa setMinimumDuration()*/void Q3ProgressDialog::forceShow(){ if (d->shown_once || d->cancellation_flag) return; show(); d->shown_once = true;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -