IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

ouvrir une QMainWindow depuis une première QMainWindow

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut ouvrir une QMainWindow depuis une première QMainWindow
    Bonjours.

    Voila le problème rencontré :

    J'ouvre une QMainWindow grâce à un double héritage depuis un .ui que j'ai créé.

    Puis je souhaiterai ouvrir une deuxième QMainWindow, depuis un slot de ma première, qui fermerai la première, et lance la seconde (elle aussi tirée d'un double hériatge depuis un .ui).

    Donc depuis un slot, je ferme la fenètre actuelle et en créé une nouvelle.

    Cela fonctionne, mais ma seconde fenêtre se ferme immédiatement, et la première reste ouverte. Seulement, en utilisant la méthode close() sur ma première fenêtre, soi avant d'ouvrir la seconde => elle ne s'ouvre pas
    soit après => tout se ferme

    Je voudrai donc découvrir comment faire pour que ma seconde QMainWindow reste ouverte, et que la première se ferme.

    Mon code actuel est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void MainWindow::on_action_Truc_triggered()
    {
    	Window win;
    	win.show();
    	close();
    }
    Merci de votre aide généreuse !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::on_action_Truc_triggered()
    {
    	Window win;
    	win.show();
    	close();
    }
    Je réponds à ton problème par une question :
    Quelle est la durée de vie de variable win (quand est elle détruite) ?

    G.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    A vrai dire, je ne comprend pas pourquoi vous me demandez ça ...
    Je veux justement que ma Win reste ouverte, donc pas la détruire ...

    Mais je suppose qu'une fois détruite, une fenêtre est tout simplement retirée de la RAM ... Les informations qui la compose sont éffacées ...

    Je sens qu'il va y avoir une histoire de pointeurs ... J'ai déja tenté d'envoyer un pointeur à ma Win, et que ce soit celle-ci qui ferme ma MainWindow, mais cela n'a pas marché ...

    Il y a une manip "bizarre" à faire, où c'est juste un problème de gestion de mémoire ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    A vrai dire, je ne comprend pas pourquoi vous me demandez ça ...
    Je veux justement que ma Win reste ouverte, donc pas la détruire ...
    Quand tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::on_action_Truc_triggered()
    {
    	Window win;
    	win.show();
    	close();
    }
    Ton objet win de type Window est crée lors de l'appel de la fonction. Hors, étant donné la manière dont il est instancié, il sera détruit à la fin du bloc, c'est à dire à l'acolade "}". Le destructeur de ta classe Window est donc appelé (ce qui va appelé celui de la classe parent) et ta fenêtre va donc être fermée et en effet supprimer de la RAM.

    Donc comme tu l'as constaté, ta fenêtre apparaît et disparaît aussitôt.

    Je sens qu'il va y avoir une histoire de pointeurs
    Il y a donc plusieurs solutions pour répondre à ton problème, dont l'utilisation de pointeurs.
    Attention ce qui suit n'est pas à utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::on_action_Truc_triggered()
    {
    	Window* win = new Window();
    	win->show();
    	close();
    }
    Cette méthode fera apparaître ta nouvelle fenêtre correctement, MAIS le problème est que tu risques de fermer ton application sans détruire ta fenêtre, et donc ne pas libérer toute la RAM utilisée par ton programme (c'est ce qu'on appelle une fuite mémoire).

    Pour éviter ça, il faut que tu mettes dans le constructeur de ta classe Window :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWindowFlags (Qt::WA_DeleteOnClose);
    Comme son nom l'indique,cela indiquera à la fenêtre de se détruire lorsque sa méthode close() sera appelée.

    J'espère que ça t'as permis de comprendre un peu plus ton problème.

    G.

    PS : Attention, cette problématique de gestion de la mémoire est très importante. Il ne faut pas le prendre à la légère.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Merci beaucoup pour cette réponse !
    Mon problème est réglé !

    Si jamais quelcun d'autre a un jours le même problème que moi et lit cette discution, Qt::WA_DeleteOnClose n'est pas un WindowFlag.

    Par conséquence, en mettant setWindowFlag, on obtient une erreure.

    Il s'agit en faite d'un Qt::WidgetAttribute.
    QMainWindow hérite de QWidget, donc pas de problème ! La ligne de code correcte est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setAttribute (Qt::WA_DeleteOnClose);
    Un petit tour dans la doc ne fait de mal à personne !

    Merci encore pour votre aide précieuse !

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Il s'agit en faite d'un Qt::WidgetAttribute.
    QMainWindow hérite de QWidget, donc pas de problème ! La ligne de code correcte est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setAttribute (Qt::WA_DeleteOnClose);
    En effet, c'est un attribut et pas un flag. C'était pour voir si tu suivais .

    Bon courage pour la suite,

    G.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2015, 17h16
  2. Réponses: 8
    Dernier message: 05/07/2011, 11h51
  3. Modifier une variable d'une classe depuis une autre classe
    Par Kezado dans le forum Général Java
    Réponses: 8
    Dernier message: 23/09/2010, 14h52
  4. [AC-2007] Copier une table depuis une base vers une autre
    Par Triton972 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2009, 19h27
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo