Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] Détection d'une fermeture de fenêtre

Quel signal et syntaxe ?

Sujet résolu
    24 mars 2008 à 10:32:45

    Bonjour à tous et à toutes,
    J'écris ce post car j'aimerais connecter un signal à une fenêtre, mais je n'y arrive pas.
    Le signal doit être émis quand le fenêtre se ferme. L'ennui c'est que ca fait rien.

    Pour vérifier que mon code marche j'ai insérer un MessageDialog qui doit se lancer dans le slot.

    Voici des portions de code de ma classe (je vais pas tout mettre : c'est trop long ^^ ) :

    Mon header (la macro Q_OBJECT est mise, rassurez-vous :D )
    1. void CloseInterface(QCloseEvent *event = 0);


    m_window_interface est un attribut de ma classe (de type QMainWindow). La classe hérite de QWidget
    1. connect(m_window_interface, SIGNAL(closeEvent(QCloseEvent*)), this,
    2.                             SLOT(CloseInterface(QCloseEvent*)));


    Voila, je pense que c'est la syntaxe connect();
    Je sais jamais si je la fait bien (et pourtant j'ai suivi le tuto de M@teo avec attention !

    Merci d'avance pour toute aide proposée !!!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 mars 2008 à 10:52:57

      plus simple, utilise le SLOT(close())

      et redéfinie la méthode CloseEvent()
      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2008 à 12:31:51

        Oui j'y avais pensé ^^

        Cela donne ceci dans le header :
        1. void CloseInterface();


        Et cela dans l'implémentation :
        1. // Ceci n'est qu'une portion du code
        2. void Musique::Interface(MainWindow *Parent){
        3. m_window_interface = new QMainWindow(Parent);
        4. connect(m_window_interface, SIGNAL(close()), this,
        5.                             SLOT(CloseInterface()));
        6. }
        7. void Musique::CloseInterface(){
        8. QMessageBox::warning(this, tr("ESSAI"), tr("Signal recu !!!"));
        9.     m_window_interface->close();
        10.     m_action_interface->setEnabled(true); // On autorise après avoir fermé la fenêtre la gestion des playlist
        11. }


        Mais ce ne m'envoie pas la boîte de dialogue quand je clique sur la croix rouge (mais ce me le fait quand je clique sur un bouton de la toolbar qui est censé faire le même effet que cette croix).

        Pour mon cas, j'ai deux options :

        - Soit je trouve la solution de ce problème (ce qui serait pas mal ^^ pour ma curiosité :D )
        - Soit j'arrive à rendre une fenêtre de type QMainWindow modale par rapport à la principale (mais je ne sais pas comment faire mais là aussi ma curiosité me pousse à trouver la solution ^^ )

        Merci d'avance pour toute réponse :)


        [EDIT] : AHHHHHHH le SLOT Close !!!!!!!! d'accord.... (oui c'est un public slot close() !!!

        Par contre je en vois pas comment je pourrais redefnir la methode CloseEvent... car m_window_interface n'est pas ma classe ...
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 mars 2008 à 12:43:17

          Tu as déclaré CloseInterface comme étant un slot ?

          1. private slots:
          2. void CloseInterface();


          Et puis ta synthaxe est étrange :

          Quand m_window_interface se ferme, tu fermes m_window_interface (SIGNAL(close()) est attribué à m_window_interface et dans CloseInterface, tu fais m_window_interface->close())
          • Partager sur Facebook
          • Partager sur Twitter
            24 mars 2008 à 13:07:51

            Oui il est dans private slots puisque quand je clique sur un bouton que j'ai mis dans la toolbar , ca doit faire le même effet et là ca marche...

            Ce que je n'arrive c'est détecter l'activation de la croix rouge
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 mars 2008 à 13:41:31

              Mais close n'est pas un signal, c'est un slot...

              Utilise le signal destroyed() (hérité de QObject), je pense que ça marchera
              • Partager sur Facebook
              • Partager sur Twitter
                24 mars 2008 à 14:05:12

                La non plus ca ne marche pas :

                1. connect(m_window_interface, SIGNAL(destroy()), this,
                2.                             SLOT(CloseInterface()));


                Aucun signal émis quand je ferme avec la croix rouge par contre avec le bouton de la toolbar ca marche !
                • Partager sur Facebook
                • Partager sur Twitter
                  24 mars 2008 à 14:14:08

                  c'est pas plutot closed()??
                  sinon, va voir du coté des evenement( et oui, la fermeture c'est un evenement!)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mars 2008 à 14:20:02

                    Salut !

                    Je suis pas encore très doué dans la programmation, mais si tu trouves pas de signal qui convient, tu pourrais créer un booléen qui vérifie si ta page est toujours active ou non, du genre :

                    1. (début du code de ta fenêtre)
                    2. bool active = true;
                    3. ....(ton code)
                    4. bool active = false;
                    5. (fin du code de ta fenêtre)


                    Comme ça, si la fonction qui active ta fenêtre n'est pas appelée, le booléen restera en false.

                    T'auras juste à faire un if dans ton programme (à condition que le bool soit déclaré dans ta classe) et voilà.

                    C'est un peu bourrin mais ça doit marcher je pense.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mars 2008 à 14:27:40

                      Oui ca pourrait marcher mais j'imagine qu'il y a une alternative plus propre (niveau code et processus ^^ ).
                      Et puis, je sais que je doit être un peu chi@@@, mais ma curiosité me pousse à trouver cette réponse :D
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mars 2008 à 14:50:56

                        D'ailleur ca m'interesse également, Qt apparement semble fonctionner avec des slots / signaux, cependant on y retrouve des evenements. J'ai beaucoup travaillé avec swing en java. Certes c'était moins riche en possibilitées, mais ça avait le merite d'être simple et efficace.
                        Qt me déroute un peu. J'ai regardé le tutoriel de Qt, celui qui apprend à faire un petit jeu de cannon ( tir aux pigeons en fait :p ), et les evenements de souris sont utilisés, alors que pendant 5heures hier j'ai fouillé la doc pour trouver un signal de souris sur un QWidget, et résultat, ca n'existe pas.

                        Je ne critique pas, j'essaye d'apprendre à utiliser cette bibliothèque, mais à premier abord elle est costaud. Donc si quelqu'un ayant une bonne maitrise pouvait faire un petit recap des evenements/signaux, leurs différences, ou chercher dans la doc pour acceder aux evenements, comment les concevoir et les utiliser, ca pourrait aider je pense ( également pour l'auteur du topic qui semble autant desorienté que moi ).

                        Au plaisir chers zéros ..
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 mars 2008 à 14:52:52

                          Les evenements on les trouve dans QObject ou QWidget en grand nombre et protected functions.

                          Elles se terminent presque tous par event !
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 mars 2008 à 14:58:38

                            Et comment ça s'utilise ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 mars 2008 à 15:05:52

                              Justement je ne peux pas te répondre, puisque j'ai l'impression que c'est ma syntaxe qui est fausse ! ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 mars 2008 à 15:51:48

                                il faut surcharger la méthode closeEvent de QWidget, qui est dans la section "Protected Functions".
                                pour utiliser tout les autres types d'évènement tel que la gestion clavier et etc, il y a tout une quantité de méthode surchargeable, qui finisse tous par Event dans leur nom.

                                dans ton .h :
                                1. protected :
                                2.         void closeEvent(QCloseEvent* event);


                                dans ton .cpp :
                                1. void MaClasseQuiHeriteDeQWidget::closeEvent(QCloseEvent* event) {
                                2.         int ret = QMessageBox::question(this,"Quitter?","Voulez-vous vraiment quitter?",QMessageBox::Yes | QMessageBox::No);
                                3.         if (ret == QMessageBox::Yes)
                                4.                 event->accept();
                                5.         else event->ignore();
                                6. }


                                ... et oublie le QObject::connect ! :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                  24 mars 2008 à 16:31:43

                                  Mais comment je pourrais faire pour définir le contenu de cet event dans ma classe (je n'ai pas envie de créer une autre classe juste pour un p'tit signal....)

                                  Est-ce que dans l'implémentation, on ne peut pas faire une truc de ce style :

                                  1. void m_window_interface->closeEvent(QCloseEvent *event){}


                                  en gros, redéfinir le membre d'un attribut ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 mars 2008 à 16:47:00

                                    Hum .. c'est ce que je viens de faire ? :-°

                                    et cette ligne "void m_window_interface->closeEvent(QCloseEvent *event){}" est invalide.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                      24 mars 2008 à 16:51:32

                                      Oui mais je pensais aussi que c'était invalide !!
                                      Mais n'y a t-il pas une autre alternative que de créer une classe ou de faire un truc comme j'ai dit plus haut ?

                                      [EDIT] : J'ai réussi à faire la suite sans passer par ce signal ;) . J'imagine que de toute façon on peut pas. J'ai joué sur les pointeurs et les delete (pour que le fenêtre active s'efface).

                                      Voila je mets ce sujet en résolu :D
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      [QT] Détection d'une fermeture de fenêtre

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown