QProgressDialog doubt



  • Im needing to use a endless progressbar, because I dont know when my program will end, and later close it. I try this if this code:
    @
    QProgressDialog ProgressDialog("Processing","Cancel", 0,0, this);
    ProgressDialog.setWindowModality(Qt::WindowModal);
    ProgressDialog.setValue(0);
    MyFunction();
    ProgressDialog.close();
    @

    But the dialog doesnt show... what I need to do?

    thanks



  • Call qApp->processEvents(); into function MyFunction(); because of progress bar is used in one thread with calculation.



  • How I do access qApp inside a QMainWindow? Im insisde of my MainWindow....



  • Maybe show() is forgotten for ProgressDialog ? And alexman is right about processEvents(). qApp is accessible everywhere, it is pointer to current running QApplication.



  • Im receiving some errors trying to pass qApp pointer to other class of the function that I use.

    Says that "unexpect token 'const'"

    here is my function declaration:

    @
    void BalancedMerge_Multipath::Sort(const char *sFileName, uint32_t uKeyQuantity,
    uint32_t uMemorySize,
    uint32_t uBufferSize, QApplication *qApp)
    @



  • Can you say why do you want to pass it? It is available everywhere where you have QApplication header included



  • [quote author="Denis Kormalev" date="1287947743"]Can you say why do you want to pass it? It is available everywhere where you have QApplication header included[/quote]

    Hummm, didnt know that this was possible.

    Ok I put qApp->processEvents() in some loops of my function. But nothing happens... any tip?



  • Maybe you can show some code? It will help me and others to find the problem.



  • @
    ProgressDialog.setWindowModality(Qt::WindowModal);
    ProgressDialog.setMinimumDuration(0);;
    ProgressDialog.setValue(0);
    ProgressDialog.setRange(0,0);
    if(ui->radioButton_isMultipath->isChecked())
    {
    BalancedMerge_Multipath balancedMerge_Multipath;
    time(&initialTime); // Start Timer
    balancedMerge_Multipath.Sort(ui->lineEdit_File_BalancedMerge->text().toStdString().c_str(),uFileSize, uMemorySize, ui->spinBox_BufferSize_BalancedMerge->value());
    time(&finalTime); // Stop Timer
    }
    @
    Inside balancedMerge_Multipath.Sort() I call qApp.processEvents()..



  • Again, what about show()ing dialog?



  • show(), shows the dialog, but it doesnt have a progressbar or something, just stay there freezed.



  • bq. "From the API docs of QProgressDialog":http://doc.trolltech.com/main-snapshot/qprogressdialog.html#details
    A common problem with progress dialogs is that it is difficult to know when to use them; operations take different amounts of time on different hardware. QProgressDialog offers a solution to this problem: it estimates the time the operation will take (based on time for steps), and only shows itself if that estimate is beyond minimumDuration() (4 seconds by default).

    As you set the range from 0 to 0 the dialog assumes there is nothing to do and does not show up. You must set a reasonable range and call setValue() regularly to make the dialog visible.



  • Yes.. but I dont know when or how much steps I will do.. this is because I use setRange(0,0) so it just show a busy indicator.



  • If you set the range from 0 to 0 there is obviously no work to be done, so the dialog will never show up.

    I'd try this:
    @
    progress->setWindowModality(Qt::WindowModal);
    progress->setLabelText("Please wait...");
    progress->setRange(0,10);
    // always show the dialog
    // do no assumed time calculation
    progress->setMinimumDuration(0);
    // disable the cancel button at all
    progress->setCancelButton(0);
    // eventually show the dialog
    progress->setValue(1);
    @



  • You can use exec to show your dialog. But it works only for me if i use a new Thread for my function. I'm looking for a solution without threads, but can't find something.

    @
    QProgressDialog dlg("Running...", QString(), 0, 0, this, Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    dlg.setRange(0,0);
    MyThread* work = new MyThread();
    connect(work, SIGNAL(statusText(QString)), &dlg, SLOT(setLabelText(QString)));
    connect(work, SIGNAL(finished()), &dlg, SLOT(cancel()));
    connect(work, SIGNAL(errorText(QString,QWaitCondition*)), this, SLOT(workError(QString,QWaitCondition*)));
    work->start();
    dlg.exec();
    @



  • Use single @ tag before and after code. I've fixed it in this comment, but don't forget about it in future posts.

    What do you mean by "solution without threads"?



  • If you do your work in the main thread, then that thread is blocked with your work. You want to process the pending events from time to time, eg. with "QCoreApplication::processEvents() ":http://doc.qt.nokia.com/4.7/qcoreapplication.html#processEvents

    If you do the work in a separate thread, the main thread's event loop continues to run and everything is updated automatically.



  • As long as i am waiting for a TIMEOUT
    @
    _tcpSocket.waitForConnected(TIMEOUT)
    @
    i want to show the QProgressDialog.

    Something like
    @
    QProgressDialog dlg("Running...", QString(), 0, 0, this, Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    dlg.setRange(0,0);
    //dlg.exec()
    _tcpSocket.waitForConnected(TIMEOUT)
    dlg.cancel()
    @
    but if i use exec only the ProgressBar is running forever.

    Thank u for helping with the code tag. Hope its better now.



  • this snippet works for me:

    @
    QProgressDialog pd;
    pd.setLabelText("waiting for connect");

    pd.setWindowModality(Qt::WindowModal);
    pd.setRange(0,0);
    // always show the dialog
    // do no assumed time calculation
    pd.setMinimumDuration(0);
    // disable the cancel button at all
    pd.setCancelButton(0);
    // eventually show the dialog
    pd.setValue(1);

    QTcpSocket sock;
    connect(&_tcpScoket, SIGNAL(connected()), &pd, SLOT(cancel()));
    _tcpScoket.connectToHost("host", 80);
    _tcpScoket.waitForConnected(30000);
    @

    Be aware that there is no need to explicitly exec the progress dialog (in contrary to an "ordinary" QDialog).



  • @Volker: Thank you. With processEvents() i can get the dialog visible. But it doesn't show title or progressbar. Only blank window. Some time ago i tried to put the tcpsocket in another thread, but it wasn't easy so it remained in the main thread. Is there a way to start the progressdialog in a new thread?

    edit: Just seen your answer. I will try it.



  • No, you must start gui elements in the main thread.

    It depends on you application what to do exactly. If the app should block until the connection is done you can try something like this:

    @
    QProgressDialog pd;
    // setup the dialog like posted

    QEventLoop el;
    connect(&_tcpScoket, SIGNAL(connected()), &el, SLOT(quit()));

    QTcpSocket sock;
    connect(&_tcpScoket, SIGNAL(connected()), &pd, SLOT(cancel()));
    _tcpScoket.connectToHost("host", 80);
    el.run();
    pd.cancel();
    @

    This runs a local event loop, it keeps the QApplication running, but blocks the flow of control in the method until the socket is connected (and thus the event loop stops).

    You will have to add some error handling (eg. connect to the error signal of the socket) and/or add a QTimer to setup a timeout.



  • I tried your code, but it did not work.
    The first shows only for a second a pop-up after it finished waiting.
    With the second i don't know where to call @_tcpScoket.waitForConnected(30000) @? I think el.run() should be el.exec()?



  • Ahm. The progress dialog is only shown until the initial TCP connection has been set up. This usually takes less than a second on a decent internet connection... How long do you expect that to last in your case?



  • Mh, i tried to connect to a not given IP. I want to see the dialog while
    @
    _tcpScoket.waitForConnected(30000)
    @
    is active till it times out. At 30000 ms.

    In not working code:
    @
    dlg.show()
    _tcpScoket.waitForConnected(30000)
    dlg.cancel()
    @

    But in this 30000ms i don't get updates to my gui. Like i expected. But i'm looking for a way, to have my progressdialog running during this 30000 ms without calling waitForConnected from another thread because i don't want to move my socket from the main thread.
    I think it's not possible?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.