QProgressDialog , processEvents и QThread



  • Здравствуйте!
    У меня имеется QProgressDialog, который описывает состояние процесса, идущего в отдельном потоке.При нажатии Cancel пользователю выдается сообщение, действительно ли он хочет остановить процесс. ProgressDialog является немодальным. Все работает как нужно, но после появления QMessageBox по каким-то причинам QProgressDialog вылезает вперед QMessageBox(загораживает его, другими словами).Как это убрать? Это код запуска отдельного потока
    @QProgressDialog ProgressDialog=new QProgressDialog(QObject::trUtf8("Идет экспорт справочников"),QObject::trUtf8("Отмена"),0,100, this);
    ProgressDialog->setWindowFlags(ProgressDialog->windowFlags()&~Qt::WindowContextHelpButtonHint);
    QThread thread=new QThread();
    workerExp=new LoadingWorkerExp();
    workerExp->moveToThread(thread);
    workerExp->setDefaults(ExportDialog.getFileName(),ExportDialog.getDateTime1(),ExportDialog.getDateTime2());
    connect(thread, SIGNAL(started()), workerExp, SLOT(ExportFunc()));
    /
    … и при запуске потока будет вызван метод LoadingProcess(), который обновит БД и будет работать в новом потоке
    /
    connect(workerExp, SIGNAL(finished()), thread, SLOT(quit()));
    /* … и при завершении работы по обновлению БД, обертка передаст потоку сигнал finished() , вызвав срабатывание слота quit()/
    connect(workerExp, SIGNAL(finished()), workerExp, SLOT(deleteLater()));
    /
    … и обертка пометит себя для удаления при окончании построения отчета*/
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    /* … и поток пометит себя для удаления, по окончании обновления БД. Удаление будет произведено только после полной остановки потока. */
    connect(workerExp,SIGNAL(ValueChanged(int)),ProgressDialog, SLOT(setValue(int)));
    connect(workerExp,SIGNAL(MessageShow()),SLOT(MessageExportSlot()));

    connect(workerExp,SIGNAL(StopExporting()),workerExp,SLOT(StopExportProcess()));//вызываем сигнал отмены экспорта
    connect(ProgressDialog,SIGNAL(canceled()),this, SLOT(AskUserExporting()));//спрашиваем, действительно ли пользователь хочет отменить экспорт
    connect(workerExp, SIGNAL(finished()), ProgressDialog, SLOT(cancel()));
    ProgressDialog->show();
    thread->start();@

    Это схематичный вариант того, что происходит в слоте ExportFunc, т.е. в отдельном потоке

    @while ((query.next())&&(stopped))
    {
    value++;
    percentage=(value100)/count;
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    QEventLoop loop; QTimer::singleShot(3000, &loop, SLOT(quit())); loop.exec();
    if (stopped)
    {
    emit ValueChanged(percentage);
    }
    }
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    while ((query2.next())&&(stopped))
    {
    value++;
    percentage=(value
    100)/count;
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    QEventLoop loop; QTimer::singleShot(3000, &loop, SLOT(quit())); loop.exec();
    if (stopped)
    {
    emit ValueChanged(percentage);
    }
    }
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    while ((query3.next()&&stopped))
    {
    value++;
    percentage=(value*100)/count;
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    if (stopped)
    {
    emit ValueChanged(percentage);
    }
    }
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    file.close();
    }
    if (stopped)
    {
    emit finished();
    emit MessageShow();
    }
    else
    {

    emit finished();
    }@
    Скорее всего дело в ProcessEvents, но точно не могу разобраться.Спасибо большое!


Log in to reply
 

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