Je suis en train d'ajouter une interface graphique à un projet original écrit pour le fonctionnement de la console. J'ai choisi Qt comme framework et j'ai maintenant du mal à gérer l'événement close de QProgressDialog.Problème de fermeture/annulation QProgressDialog
Problème 1: J'ai utilisé QtConcurrent :: run pour fourchonner un processus pour une tâche longue/lourde et un QProgressDialog 'en attente' (plage de 0,0) pour indiquer à l'utilisateur un processus de longue durée. Le problème est que je ne peux pas avoir le dialogue pour se fermer!
void MainWindow::doLongRunProcess() {
pDialog = new QProgressDialog("Loading 2 ...", "Abort", 0, 0, this);
pDialog->setWindowModality(Qt::WindowModal);
pDialog->show();
QFuture<void> future = QtConcurrent::run(theApp, &SimApplication::runSimulation);
QFutureWatcher<void> watcher;
connect(&watcher,
SIGNAL(finished()),
this,
SLOT(endLongRunProcess()));
watcher.setFuture(future);
// at this point, the runSimulation is successfully invoked
}
void MainWindow::endLongRunProcess()
{
// no sign of being invoked!
if (pDialog)
{
pDialog->close();
delete pDialog;
}
logMessage("Operation completed");
}
Exigence 1: Si possible, ne pas toucher/modifier le code de l'emballage d'origine.
Problème 2: Comment lier le bouton "Abandonner" pour terminer le SimApplication :: runSimulation()?
Qu'est-ce que watcher.isFinished(); résultats? Vous pouvez ajouter un emplacement public pour imprimer l'état de watcher.isFinished(); pour confirmer qu'il se termine réellement ... –
@IlyaKobelevskiy, dans l'appel runSimulation(), j'ai l'impression de débogage qui a montré que l'appel est terminé. Pour watcher.isFinished(), comment configurer le slot? –
créer votre observateur sur la pile l'aura détruit immédiatement à la fin du constructeur. Essayez de le créer sur tas/en faire un membre de classe. –