[Qt-interest] the problem of QProgressDialog & QProgressBar
John McClurkin
jwm at nei.nih.gov
Tue Jul 14 15:03:35 CEST 2009
Malyushytsky, Alex wrote:
> >> But the progress dialogue only shows after( or at the same time) THE
> SysInfo Dialogue.
> >> WHY??
>
> Because of p_ShowSysInfoDlg->exec(); I guess.
>
> I don’t think event loop of application is running when you open another
> modal dialog.
>
>
>
> Regards,
>
> Alex
>
>
>
> * *
>
> * *
>
> *From:* qt-interest-bounces at trolltech.com
> [mailto:qt-interest-bounces at trolltech.com] *On Behalf Of *Gan Xiebin
> *Sent:* Monday, July 13, 2009 11:01 PM
> *To:* qt-interest
> *Subject:* Re: [Qt-interest] the problem of QProgressDialog & QProgressBar
>
>
>
> Hi Alex,
>
> Thanks for reply.
> I have a code like that,
>
> ----------------------
> void MainWindow::SysInfoFunc()
> {
> SysInfoDlg *p_ShowSysInfoDlg = new SysInfoDlg( );
> p_ShowSysInfoDlg->exec();
> }
>
> SysInfoDlg::SysInfoDlg(QWidget *parent)
> : QDialog( parent )
> {
> textLabel = new QLabel();
>
> thread1.start(); // A task
> thread2.start(); // Another task
>
> thread1.wait(); // wait for task finished, and set text to the label
> thread2.wait(); // like thread1 ...
>
> textLabel->setText( ... );
>
> }
> ------------------------------------
>
>
> I must ensure that the application does not freeze.
> I read the document carefully, and used QProgressDialog ...
>
> ---------------------------------------------
> void MainWindow::SysInfoFunc()
> {
>
> progressDlg = new QProgressDialog("Operation in progress.",
> "Cancel", 0, 100, this);
> connect(progressDlg, SIGNAL(canceled()), this,
> SLOT(cancelProgressDlg()));
> timer = new QTimer(this);
> connect(timer, SIGNAL(timeout()), this, SLOT(performProgressDlg()));
> timer->start(0);
>
> progressDlg->setValue(0);
>
> SysInfoDlg *p_ShowSysInfoDlg = new SysInfoDlg(node);
> p_ShowSysInfoDlg->exec();
>
> progressDlg->setValue(progressDlg->maximum());
>
> }
>
> void MainWindow::cancelProgressDlg()
> {
> timer->stop();
> progressDlg->close();
> }
>
> void MainWindow::performProgressDlg()
> {
> if(progressDlg->value() + 1 < progressDlg->maximum())
> {
> progressDlg->setValue(progressDlg->value() + 1);
> }
> else
> {
> timer->stop();
> progressDlg->close();
> }
>
> qApp->processEvents();
> }
> --------------------------------
>
>
> But the progress dialogue only shows after( or at the same time) THE
> SysInfo Dialogue.
> WHY??
>
> P.S. : I used the model dialogue of QProgressDialog, but have no effect
> for me.
>
> Thanks.
Alex is correct. calling p_ShowSysInfoDialog->exec() blocks the
application until it returns. If you want the progress dialog to show
progress during the execution of the SysInfoDialog, create the progress
dialog first on the heap and pass a pointer to the SysInfoDialog
constructor. Then, in the SysInfoDialog exec function, update the
progress dialog periodically and call QApplication::processEvents().
More information about the Qt-interest-old
mailing list