2010-11-30 3 views
2

J'utilise Qt pour construire une interface utilisateur et j'ai besoin d'une fenêtre de dialogue avant la fenêtre principale de l'application, de sorte que l'utilisateur peut sélectionner des fichiers pour charger des choses comme ça. Ce que j'ai est une principale assez simple:Qt Application bloque à la sortie (après QDialog exec)

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    IView *view = new QtView(); 
    view->showView(); 
    int rc = a.exec(); 
    std::cout << "exit" << std::endl; 
    return rc; 
} 

la classe QtView est la mise en œuvre concrète de l'interface iView. Il a l'instance de mainwindow et une instance de QDialog aussi. int view-> Showview() méthode ce que j'ai:

void QtView::showView() 
{ 
    this->_configDialog->exec(); 
    this->_mainAppWindow->show(); 
} 

Il fonctionne très bien, la boîte de dialogue ouvre et lorsque l'utilisateur clique sur OK, et retourne exec la fenêtre principale apparaît. Le problème est que lorsque je quitte la fenêtre principale, j'obtiens un processus de zombies et l'application semble juste se bloquer même si toutes les fenêtres ont été fermées et que je n'obtiens pas la "sortie" que j'imprime juste avant le retour principal. Je ne suis pas sûr de ce que je fais de mal, mais je reçois la même resutl même si je clique sur la croix pour fermer la boîte de dialogue, la fenêtre principale s'ouvre, et une fois fermée les choses pendent juste là.

Si quelqu'un a un conseil, ce serait cool. Merci.

Répondre

2

Je fixe mon problème. J'ai utilisé le signal accepté/rejeté/terminé (int) de QDialog pour déclencher l'emplacement d'exposition sur la fenêtre principale de l'application, et l'afficher si la boîte de dialogue a été acceptée. Merci pour l'aide de toute façon.

0

Je pense que la raison possible de ce comportement est que votre boîte de dialogue de configuration ne peut pas contenir de widget parent (c'est une supposition aveugle car vous n'avez pas cité la partie pertinente du code). Cela est dû au fait que QApplication par défaut ne se ferme que lorsque toutes les fenêtres sans parent sont fermées. Et la chose est, un dialogue n'est pas une fenêtre, techniquement - il a le type de fenêtre Qt :: Dialog plutôt que Qt :: Window. Cela signifie que toute boîte de dialogue "orpheline", qui est fermée, empêchera toujours l'application de se fermer automatiquement.

La solution? Soit donner un parent à la boîte de dialogue ou d'activer Qt :: WA_QuitOnClose attribut:

this->_configDialog->setAttribute(Qt::WA_QuitOnClose); 
+0

Ça ne marche pas non plus. L'application se termine si j'utilise ceci -> _ configDialog-> show(), mais pas quand je l'utilise -> _ configDialog-> exe(); Et même si je mets un parent sur le dialogue, pas de différence. La seule façon dont l'application se termine est si la méthode close() est appelée dans ma fenêtre principale. – dotminic

Questions connexes