2010-12-03 4 views
2

Dans le code ci-dessous, je crée une fenêtre, appelez window.show(), mais la fenêtre n'apparaît qu'après l'appel de window->iterateSolution(). Presque comme si, app.exec() est la fonction qui montre la fenêtre. Je suis très nouveau à Qt, donc je n'ai aucune idée de ce qui se passe.Qt: mainWindow-> show(); n'affiche pas la fenêtre principale

#include <QtGui/QApplication> 
#include <mainWindow.h> 
#include <Cube.h> 

mainWindow * newWindow; 

int main(int argc, char *argv[]) { 
    // initialize resources, if needed 
    // Q_INIT_RESOURCE(resfile); 

    QApplication app(argc, argv); 
    newWindow = new mainWindow; 
    newWindow->show(); 

    QString initialState = "YWOBYYBYYGRRGRRBWWYOOYGGRGGBBGYOOYOOWRRBBRBBWGOOGWWRWW"; 

    /* Construct cube, set state, and solve */ 
    Cube * cube = new Cube(initialState); 
    QString solution = cube->solve(); 
    delete cube; 
    newWindow->iterateSolution(solution); 

    // create and show your widgets here 

    return app.exec(); 
} 

Répondre

4

C'est exactement ce qui se passe. Techniquement parlant, QMainWindow :: show() ne rend pas la fenêtre visible, il définit simplement un drapeau dans la fenêtre et Qt la rendra visible à l'itération suivante de la boucle d'événements.

aussi, directement à partir de la documentation de Qt sur QApplication :: exec():

Il est nécessaire d'appeler cette fonction pour commencer la gestion des événements. La boucle d'événements principale reçoit des événements du système de fenêtres et les distribue à les widgets d'application.

Généralement, aucune interaction de l'utilisateur ne peut avoir lieu avant d'appeler exec().

+0

D'accord, mais où voudrais-je exécuter mes fonctions? – dfetter88

+2

Mettez le code entre mainWindow-> show() à app.exec() dans un emplacement "run" sur mainWindow et utilisez QTimer :: singleShot (0, mainWindow, SLOT (run())) pour l'exécuter depuis le boucle d'événement. – baysmith

+0

Habituellement, vous pouvez également opérer sur le widget pas encore visible avant même qu'il ne soit visible. –

0

Cela me semble que vous voulez avoir une application multithread. Un thread doit être responsable de l'interface utilisateur et un autre thread résout le cube et publie les mises à jour dans le thread d'interface utilisateur pour afficher la progression. Vous pouvez faire en sorte que l'objet Cube et l'objet mainWindow communiquent en utilisant des signaux et des emplacements pour résoudre les problèmes de communication entre threads (voir http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/). Sinon, si vous mettez les deux opérations sur le même thread, l'interface utilisateur se "bloquera" car le thread principal ne pourra pas traiter les événements de l'interface utilisateur (y compris l'événement show auquel vous faites spécifiquement référence dans votre question) . Si cela est excessif, vous pouvez simplement demander à l'application de traiter explicitement les événements de l'interface utilisateur en appelant QApplication :: process (...) avant (et de préférence pendant) les opérations synchrones de longue durée. Cela effectuera une mise à jour unique de l'interface utilisateur afin que l'utilisateur (et le système d'exploitation) sache que l'application n'est pas bloquée.

Questions connexes