Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec classe QPushbutton

Création d'une classe Bouton

    9 novembre 2018 à 11:15:06

    Je débute avec Qt. Je ne sais pas si c'est comme cela que l'on pose une question sur la forum. Je voudrais créer une fenêtre avec à l'intérieur un bouton de type Bouton et non avec QPushbutton. Avec le code suivant, ça plante. Merci d'avance

    Voici mon code:

    pro:

    QT+=widgets
    SOURCES+=\
    main.cpp\
    fenetre.cpp\
    bouton.cpp
    HEADERS+=\
    fenetre.h\ 
        bouton.h
    bouton.h
    #ifndefBOUTON_H
    #defineBOUTON_H
    #include<QApplication>
    #include<QWidget>
    #include<QPushButton>
    #include"fenetre.h"
    classBouton:publicQPushButton
    {
    Q_OBJECT
    public:
    Bouton(QStringtexte);
    private:
    QStringm_texte;
    };
    #endif//BOUTON_H


    fenetre.h

    #ifndefFENETRE_H
    #defineFENETRE_H
    #include<QApplication>
    #include<QWidget>
    #include<QPushButton>
    classFenetre:publicQWidget
    {
    public:
    Fenetre(intlng,intlarg);
    ~Fenetre();
    private:
    intm_longueur;
    intm_largeur;
    Bouton*m_bouton;
    };
    #endif//FENETRE_H



    bouton.cpp

    #include"bouton.h"
    #include"fenetre.h"
    Bouton::Bouton(QStringtexte):m_texte(texte)
    {
    }
    fenetre.cpp
    #include"fenetre.h"
    #include"bouton.h"
    Fenetre::Fenetre(intlng,intlarg):m_longueur(lng),m_largeur(larg),m_bouton(0)
    {
    setFixedSize(lng,larg);
    m_bouton=newBouton("test",this);
    m_bouton->setFont(QFont("ComicsansMS",14));
    m_bouton->move(60,50);
    }
    Fenetre::~Fenetre()
    {
    deletem_bouton;
    }
    main.cpp
    #include<QtWidgets>
    #include<QApplication>
    #include<QPushButton>
    #include<QString>
    #include"fenetre.h"
    #include"bouton.h"
    intmain(intargc,char*argv[])
    {
    QApplicationapp(argc,argv);
    Fenetrefenetre1(500,300);
    fenetre1.show();
    returnapp.exec();
    }

    • Partager sur Facebook
    • Partager sur Twitter
    RL
      9 novembre 2018 à 11:33:56

      Bonjour,

      1

      Dans votre fichier *.pro ajoutez :

      ====================================

      QT+=coregui

      greaterThan(QT_MAJOR_VERSION,4):QT+=widgets

       =====================================

      a partir de la ligne 1

      2:

      Dans la colonne "Projet de Qt un clic Droit sur le nom de votre projet , et dans le menu déroulant  choisir "exécuter "qmake".

      En principe cela devrait fonctionner.

      TRES important avant de compiler il faut TOUJOURS fermer la compile et l'execution précédante, sinon il vous offre des erreurs introuvables.

      Bon courage

      • Partager sur Facebook
      • Partager sur Twitter
        9 novembre 2018 à 19:00:39

        Bonjour,

        merci de votre réponse, mais j'ai le message 'Bouton' does not name a type

        Je ne vois pas ce que je peut faire.

        • Partager sur Facebook
        • Partager sur Twitter
        RL
          10 novembre 2018 à 8:47:14

          Bonjour,

          Il y a un truc qui m'inquiète en lisant vos données, vous ne mettez aucun espace

          Exemple :  #include<QPushButton>

          Sauf erreur de ma part il faut mettre des espaces : #include <QPushButton>

          • Partager sur Facebook
          • Partager sur Twitter
            10 novembre 2018 à 11:00:05

            Bonjour,

            Les espaces figurent bien dans mon code, mais le copier-coller dans le forum les a supprimé. J'ai toujours le même message dans fenetre.h

            Merci de votre aide;

            • Partager sur Facebook
            • Partager sur Twitter
            RL
              11 novembre 2018 à 8:26:06

              Non, dans la directive include, l'espace n'est pas nécessaire, tu peux le mettre ou pas, c'est purement à ta convenance. Certains programmeurs en mettent, d'autres pas (moi, par exemple, je n'en met pas et cela ne m'a jamais posé le moindre problème), c'est une convention purement esthétique.

              Pour poster du code utilise le bouton </> de l'éditeur de message, puis dans la fenêtre choisis le langage que tu veux afficher, ça donne quelque chose de plus lisible ;)

              Quelques remarques

              La gestion de la mémoire avec Qt est un peu spéciale, les objets dérivés de QObject (et donc tout ceux dérivés de QWidget, puisque QWidget dérive de QObject) sont pris en charge par le système parent/enfant de Qt. Le constructeur d'une classe qui dérive de QObject ou QWidget devrait posséder un paramètre de type QObject * ou QWidget * servant à passer le parent, afin de rentrer dans le système parent/enfant de Qt.

              class Fenetre : public QWidget
              {
                 Q_OBJECT
              public:
              
                 Fenetre(int h,int w,QWidget * owner = nullptr);
              
                 virtual ~Fenetre() = default; /* on dérive de QWidget,
                                                  donc destructeur virtuel obligatoire!
                                                  
                                                  Comme le système parent/enfant de Qt 
                                                  va prendre en charge m_bouton, le destructeur 
                                                  généré par le compilateur sera parfait. 
                                                */
              
                 // ...
              
              };
              
              Fenetre::Fenetre(int h,int w,QWidget * owner)
                 :QWidget{owner}
                 ,m_longueur{h}
                 ,m_largeur{w}
                 ,m_bouton{new Bouton{"test",this}}
              {
                 ///...
              }

              Petite remarque, QPushButton dérive de QWidget, donc ceci est valable pour toute classe dérivée de QPushButton...

              -
              Edité par int21h 11 novembre 2018 à 8:41:51

              • Partager sur Facebook
              • Partager sur Twitter
              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                11 novembre 2018 à 9:35:44

                Bonjour,

                Merci pour la précision sur les espace, je ne savais pas .

                • Partager sur Facebook
                • Partager sur Twitter
                  11 novembre 2018 à 17:57:58

                  Bonjour, j'ai donc testé avec cette modif, mais j'ai toujours le message d'erreur 'Bouton' does not name a type à l'instruction Bouton *m_bouton; du fenetre.h

                  Merci quand même.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  RL
                    12 novembre 2018 à 10:31:22

                    Tu as un include circulaire. Bouton.h inclus Fenetre.h et Fenetre.h inclus Bouton.h. Que Fenetre.h incluse Bouton.h c'est normal, le compilateur a besoin de connaître Bouton pour comprendre Fenetre (encore que comme on ne déclare qu'un pointeur sur Bouton, une déclaration forward pourrait suffire, on déporterait alors l'include dans le cpp), par contre, l'include de Fenetre.h dans Bouton.h ne sert strictement à rien vu qu'a aucun moment dans Bouton.h tu ne mentionnes ta classe Fenetre, et au passage c'est lui qui fout la merde en provoquant l'inclusion circulaire.

                    -
                    Edité par int21h 12 novembre 2018 à 10:32:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                      12 novembre 2018 à 11:52:58

                      Bonjour,

                      J'ai à présent le message d'erreur no matching function for call to 'Bouton::Bouton(const char [5], Fenetre*) dans fenetre.cpp.

                      Merci quand même.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      RL
                        12 novembre 2018 à 11:56:20

                        Ben, si on considère ton code tout en haut (j'ai pas tout lu), c'est normal, tu as aucun constructeur de Bouton qui prends 2 paramètres :(
                        • Partager sur Facebook
                        • Partager sur Twitter

                        « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                        D. Mendeleïev

                          13 novembre 2018 à 18:37:41

                          Bonjour, Je poste à nouveau mon code avec les corrections, merci de votre aide.

                          <pro >

                          <QT+=coregui>
                          <greaterThan(QT_MAJOR_VERSION,4):QT+=widgets>
                          <QT+=widgets>
                          <SOURCES+=\ >
                           < main.cpp\ >
                           < fenetre.cpp\ >
                          < bouton.cpp>
                          <HEADERS+=\ >
                          < fenetre.h\ >
                           <bouton.h \>
                          <bouton.h >

                          <#ifndefBOUTON_H >
                          <#defineBOUTON_H >
                          <#include<QApplication> >
                          <#include<QWidget> >
                          <#include<QPushButton> >
                          <classBouton:publicQPushButton>
                          <{ >
                           < Q_OBJECT >

                          <public: >
                           < Bouton(QStringtexte); >
                          <private: >
                           < QStringm_texte; >
                          <}; >
                          <#endif//BOUTON_H \>


                          <fenetre.h >

                          <#ifndefFENETRE_H >
                          <#defineFENETRE_H >
                          <#include<QApplication> >
                          <#include<QWidget> >
                          <#include<QPushButton> >
                          <#include"bouton.h" >
                          <classFenetre:publicQWidget >
                          <{ >
                           < Q_OBJECT >
                          <public: >
                           < Fenetre(intlng,intlarg,QWidget*owner=nullptr); >
                          <private: >
                           < intm_longueur; >
                           < intm_largeur; >
                           < Bouton*m_bouton; >
                          <}; >
                          <#endif//FENETRE_H \>


                          <bouton.cpp >

                          <#include"bouton.h" >
                          <#include"fenetre.h" <
                          <Bouton::Bouton(QStringtexte):m_texte(texte) <
                          <{ >
                          <} \>
                          <fenetre.cpp>
                          <#include"fenetre.h" >
                          <#include"bouton.h" >
                          <Fenetre::Fenetre(intlng,intlarg,QWidget*owner):QWidget(owner),m_longueur(lng),m_largeur(larg) >
                          <{ >
                          <setFixedSize(lng,larg); >
                           < m_bouton=newBouton("test",this); >   // c'est la que sa plante
                           < m_bouton->setFont(QFont("ComicsansMS",14)); >
                           < m_bouton->move(60,50); >
                          <} \>
                          <main.cpp <

                          <#include<QtWidgets> >
                          <#include<QApplication> >
                          <#include<QPushButton> >
                          <#include<QString> >
                          <#include"fenetre.h" >
                          <#include"bouton.h" >
                          <intmain(intargc,char*argv[]) >
                          <{ >
                           < QApplicationapp(argc,argv); >
                           < Fenetrefenetre1(500,300); >
                           < fenetre1.show(); >
                           < returnapp.exec(); >
                          <} \>
                          • Partager sur Facebook
                          • Partager sur Twitter
                          RL
                            13 novembre 2018 à 23:40:45

                            J'ai indiqué comment poster proprement du code, en pure perte...

                            J'ai résumé l'utilisation du système parent/enfant de Qt comme si j'avais dû l'expliquer à mon chat. Lui, il a rien compris, il n'est pas très malin (même pour un chat), mais son truc c'est de dézinguer ma souris, pas de faire des classes Qt, donc c'est pas trop grave ^^ 

                            Pour résumé, je t'ai mis devant l'abreuvoir, mais bon, faire boire un âne qui ne veut pas boire, comme disait mon grand père...

                            -
                            Edité par int21h 14 novembre 2018 à 0:01:10

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                              14 novembre 2018 à 9:03:11

                              Bonjour,

                              Merci de votre aide, maintenant grâce à l'utilisation du système parent/enfant de QT comme vous me l'avez expliqué, cela fonctionne très bien.

                              Excellente pédagogie.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              RL

                              Problème avec classe QPushbutton

                              × 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