Partage
  • Partager sur Facebook
  • Partager sur Twitter

c++, problème sur QT

Sujet résolu
    23 juillet 2017 à 23:04:45

    Desolé, je reformule. Je fait un exercice d'entrainement en c++ sur QT, et dans le .cpp de l'objet que je suis en train de coder, je bidouille avec les QLinesEdit et les QString. La fenetre héritante de QWidget affiche un bouton "login", et deux QLinesEdit, jusqu'ici, tout va bien. 

    Mais dans le slot du signal "clicked" de mon bouton, je créé deux QString et je les renplies via les QLineEdit (voir dans mon .cpp), puis je pose une condition qui devrait afficher un message quand le QPushButton est cliqué, pourtant il ne se passe rien.

    voici le .cpp :

    #include"ekey.h"
    EKey::EKey():QWidget()
    {
    setFixedSize(1000,500);
    m_login=newQPushButton("login",this);
    m_login->setCursor(Qt::PointingHandCursor);
    m_login->move(300,370);
    m_userI=newQLineEdit(this);
    m_userI->move(150,370);
    m_passI=newQLineEdit(this);
    m_passI->move(150,340);
    QObject::connect(m_login,SIGNAL(clicked()),qApp,SLOT(openGameMenu()));
    }
    voidEKey::openGameMenu()
    {
    QStringuser,pass;
    user=m_userI->text();
    pass=m_passI->text();
    if(user=="lal"&&pass=="lal")
    {
    QMessageBox::information(this,"login","YEES");
    }
    else
    {
    QMessageBox::critical(this,"login","NOOOO");
    }
    }
    Et voici le header :
    #ifndefEKEY_H
    #defineEKEY_H
    #include<QApplication>
    #include<QWidget>
    #include<QPushButton>
    #include<QProgressBar>
    #include<QMessageBox>
    #include<QLabel>
    #include<QInputDialog>
    #include<QLineEdit>
    #include<QString>
    classEKey:publicQWidget
    {
    public:
    EKey();
    publicslots:
    voidopenGameMenu();
    voidopenGameLoading();
    voidloadingBar();
    voidopenGameLauncher();
    voidplayGame();
    private:
    QPushButton*m_games;
    QPushButton*m_login;
    QPushButton*m_play;
    QProgressBar*m_bar;
    QStringm_user;
    QStringm_pass;
    QLabel*m_userW;
    QLabel*m_passW;
    QLineEdit*m_userI;
    QLineEdit*m_passI;
    };
    #endif
     

    Merci d'avance 

    -
    Edité par Syrotiilk 24 juillet 2017 à 11:07:19

    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2017 à 23:15:15

      Hello,

      Si tu pense que ton code est bien formé, c'est bien pour toi, mais nous on ne comprend rien ;) 

      Reformate ton message

      • Partager sur Facebook
      • Partager sur Twitter

      Architecte logiciel - Software craftsmanship convaincu.

        24 juillet 2017 à 1:41:59

        Bonjour.

        Ton code était mal intégré et tu n'avais pas correctement indiqué le langage en question. Et il n'y avait aucune indentation, ce qui n'aide pas à la lecture...

        J'ai modifié ton message pour corriger ça, mais maintenant il faudrait que tu précises les points suivant :

        • Un descriptif clair et précis du problème
        • La tentative actuelle de résolution que vous avez effectué
        • Le résultat attendu et le résultat actuel
        • Toutes pistes de recherches pouvant aider à la résolution

        -
        Edité par Lauloque 24 juillet 2017 à 1:42:37

        • Partager sur Facebook
        • Partager sur Twitter

        Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script

          24 juillet 2017 à 8:08:13

          D'après moi vue le peu de détails, tu utilises un void qui ne renvois rien (logique) donc quand tu cliques rien ne ce passe et tu ne fais aucun appel..
          • Partager sur Facebook
          • Partager sur Twitter
            24 juillet 2017 à 11:06:58

            Salut,

            LiamFriel a écrit:

            rien ne ce passe.

            Je ne suis pas d'accord, si tu vas dans la partie "Sortie de l'application", tu devrais voir le message "QApplication::openGameMenu() no such slot" ;)

            qApp est l'instance (globale) de QApplication qui se réfère à celle que tu crées dans le main(), elle ne possède pas ce slot, c'est ta classe EKey qui l'a.

            QObject::connect(m_login,SIGNAL(clicked()),this,SLOT(openGameMenu()));

             PS. Merci d'utiliser le bouton </> pour montrer correctement ton code.

            • Partager sur Facebook
            • Partager sur Twitter
              24 juillet 2017 à 11:16:28

              Merci @Squall31, j'ai modifié ma ligne de connection signal/slot comme tu me l'as dit :

              #include "ekey.h"
              
              EKey::EKey() : QWidget()
              
              {
              setFixedSize(1000, 500);
              m_login = new QPushButton("login", this);
              m_login -> setCursor(Qt::PointingHandCursor);
              m_login -> move (300, 370);
              
              m_userI = new QLineEdit(this);
              m_userI -> move (150, 370);
              m_passI = new QLineEdit(this);
              m_passI -> move (150, 340);
              
              
              
              QObject::connect(m_login,SIGNAL(clicked()),this,SLOT(openGameMenu()));
              
              }
              
              void EKey::openGameMenu()
              {
                  QString user, pass;
                  user=m_userI->text();
                  pass=m_passI->text();
                  if(user=="lal" && pass=="lal")
                  {
                      QMessageBox::information(this, "login", "YEES");
                  }
                  else
                  {
                      QMessageBox::critical(this, "login", "NOOOO");
                  }
              }
              

              Pourtant, dans Application Output, j reçois encore ceci et le bouton ne marche toujours pas :

              QObject::connect: No such slot QWidget::openGameMenu() in ..\EKEY\ekey.cpp:18


              • Partager sur Facebook
              • Partager sur Twitter
                24 juillet 2017 à 11:33:04

                Tu as oublié la macro Q_OBJECT. Rajoute-la puis exécute qmake et recompile.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 juillet 2017 à 11:48:35

                  J'ai rajouté Q_OBJECT dans mon header, et je me fait insulter par mon compilateur :

                  undifined reference to 'EKey::openGameLoading()' dans "moc_ekey.cpp", cela pour tous mes public slots

                  et "error: Id returned 1 exit status" dans collect2.exe

                  ;(

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 juillet 2017 à 11:50:04

                    Nettoie ton projet => qmake => compile
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juillet 2017 à 11:53:32

                      Projet nettoyé, qmake passé, projet compilé, toujours les mêmes erreurs

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 juillet 2017 à 11:58:46

                        As-tu défini les fonctions en question ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 juillet 2017 à 12:03:38

                          oui, elles sont dans mon header

                          public slots:
                              void openGameMenu();
                              void openGameLoading();
                              void loadingBar();
                              void openGameLauncher();
                              void playGame();



                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 juillet 2017 à 12:10:19

                            Défini (dans le .cpp), pas déclaré.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 juillet 2017 à 12:17:47

                              Ah, non je n'ai utilisé que le premier slot jusqu'ici. Est-ce que je suis obligé de créer une connection signal/slot pour tous mes slots et de les définir pour que mon compilateur me laisse compiler mon code ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 juillet 2017 à 12:25:22

                                Non, aucun besoin des connexions pour compiler. Par contre tu as besoin de définir tes fonctions pour le link :

                                void EKey::openGameMenu() { ... }
                                void EKey::openGameLoading() { ... }
                                void EKey::loadingBar() { ... }
                                void EKey::openGameLauncher() { ... }
                                void EKey::playGame() { ... }



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 juillet 2017 à 12:38:52

                                  Mais ça maaaarche ! Merci beaucoup à toi bro !!!!

                                  Une dernière petite question, si je veu que au lieu d'un QMessageBox, la condition du slot m'ouvre une nouvelle fenetre héritante de QWidget, je peu le faire localement ? Je n'ai absolument aucune idée de comment le faire.

                                  -
                                  Edité par Syrotiilk 24 juillet 2017 à 12:43:55

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 juillet 2017 à 12:53:36

                                    Aucune idée vraiment ? N'est-ce pas ce que tu fais déjà avec EKey dans le main() ? ;)

                                    Après le code sera quelque peu différent selon que tu veuilles une fenêtre modale (type QDialog) ou non.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 juillet 2017 à 14:26:55

                                      j'ai essayé ceci :

                                      void EKey::openGameMenu()
                                      {
                                          QString user, pass;
                                          user=m_userI->text();
                                          pass=m_passI->text();
                                          if(user=="lal" && pass=="lal")
                                          {
                                      QWidget gameMenu;
                                      gameMenu.setFixedSize(500, 1000);
                                      QPushButton *bouton;
                                      bouton->move(100, 100);
                                      gameMenu.show();
                                          }
                                          else
                                          {
                                              QMessageBox::critical(this, "login", "NOOOO");
                                          }
                                      }
                                      void EKey::openGameLoading() {}
                                      void EKey::loadingBar() {}
                                      void EKey::openGameLauncher() {}
                                      void EKey::playGame() {}
                                      Mais quand le slot s'execute, le programme demande à etre debuggé, puis tout freeze...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 juillet 2017 à 17:21:10

                                        Tu n'as pas initialisé ton pointeur QPushButton *bouton;

                                        Et on passe sur ton autre sujet pour le problème de fermeture immédiate.

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        c++, problème sur QT

                                        × 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