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();
while ((query.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 ((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(); }
QMessageBox* msgBox = new QMessageBox( this ); msgBox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel); msgBox->setWindowTitle(QObject::trUtf8("Экспорт обновлений справочников" )); msgBox->setText(QObject::trUtf8("Вы действительно хотите остановить экспорт?")); msgBox->setIcon(QMessageBox::Warning); int res=msgBox->exec(); if (res==QMessageBox::Ok) { ... }
C++ (Qt)QMessageBox::StandardButton reply; reply = QMessageBox::question(this, trUtf8("Экспорт обновлений справочников" ), trUtf8("Вы действительно хотите остановить экспорт?"), QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { // ... TODO }
C++ (Qt)progress.setWindowModality(Qt::WindowModal);
C++ (Qt)// Operation constructor Operation::Operation(QObject *parent) : QObject(parent), steps(0) { pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100); connect(pd, SIGNAL(canceled()), this, SLOT(cancel())); t = new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(perform())); t->start(0); } void Operation::perform() { pd->setValue(steps); //... perform one percent of the operation steps++; if (steps > pd->maximum()) t->stop(); } void Operation::cancel() { t->stop(); //... cleanup }