2013-01-21 4 views
0

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()?

+0

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 ... –

+0

@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? –

+0

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. –

Répondre

0

Essayez d'appeler setAttribute(Qt::WA_DeleteOnClose, true) sur la boîte de dialogue après avoir créé et attachez finished() à fente close() au lieu de votre emplacement de la boîte de dialogue. La boîte de dialogue va se supprimer quand il est approprié de le faire de la façon dont aurait QObject::deleteLater().

Questions connexes