Partage
  • Partager sur Facebook
  • Partager sur Twitter

cannot call member function 'virtual QLayout::

Sujet résolu
    27 mars 2015 à 17:59:22

    Bonjour

    Dans le tuto, cet exo a été fait dans le main.cpp et moi aussi, ça marche.
    Mais j'ai voulu, à titre d'exercice, intégrer cet exo des layout dans ce que  j'avais fait auparavant: une classe-mère Fenetres et une classe-fille FenetreA
    et là, jla galère!!
    Donc j'ai recommencé, ça ne marche toujours pas mais il ne reste qu'une seule erreur sur 3 lignes de mon code: j'y suis donc presque arrivé!

    Oui mais,  pour les 3 lignes QHBoxLayout:::layout-> ... , pour chacune d'elles, ça me dit:

    lignes 12, 13 et 14 ici:

      error: cannot call member function 'virtual QLayout::layout' without object.
    Mais alors, je ne vois pas de quel objet il s'agit!!! Ci-dessous le FenetreA.cpp où l'erreur sévit:

    #include "FenetreA.h"
    
    FenetreA::FenetreA(): Fenetres()
    {
        // 1°) CREATION DES WIDGETS:
        QPushButton *m_bouton1 = new QPushButton("Salut les miasmes,");
        QPushButton *m_bouton2 = new QPushButton("ici");
        QPushButton *m_bouton3 = new QPushButton("Captain Dada");
        // 2°) CREATION DU LAYOUT 
        QHBoxLayout *layout = new QHBoxLayout;
        // 3°) PLACER WIDGETS DANS dans le conteneur créé nommé LAYOUT:
        QHBoxLayout::layout->addWidget(m_bouton1);
        QHBoxLayout::layout->addWidget(m_bouton2);
        QHBoxLayout::layout->addWidget(m_bouton3);
       // 4°) FENETREA: UTILISE CE LAYOUT 
       setLayout(layout);
    }

    je vous adjoins aussi le FenetreA.h:

    #ifndef FENETREA_H
    #define FENETREA_H
    
    #include "Fenetres.h"
    #include <QApplication> 
    #include <QWidget>
    #include <QPushButton>
    #include <QtWidgets>
    
    class FenetreA : public Fenetres
    {
     Q_OBJECT
     public:
       FenetreA();
       QHBoxLayout *layout();
       QWidget addWidget();
     private:
         QPushButton *m_bouton1();
         QPushButton *m_bouton2();
         QPushButton *m_bouton3();
      }; 
    #endif 
       
    
       





    -
    Edité par moniroje 27 mars 2015 à 18:00:46

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2015 à 18:07:17

      vire simplement ces QHBoxLayout qui ne servent à rien ici.

      Tu veux accéder à une variable locale appelée layout, donc tu as juste à faire

      layout->addWidget(...);


      écrire QHBoxLayout::layout->addWidget(...) est valide, mais ça veut dire que tu accède à une variable statique de la class QHBoxLayout nommée layout. (donc pas ce que tu veux faire).

      En plus là le message d'erreur est encore moins compréhensible car la classe QHBoxLayout a une méthode layout(), donc ça  fout le bazar pour le compilo lol.

      Revoir les bases du C++ avant de se lancer dans Qt pourrait être une bonne idée. (et par pourrait être je veux dire est ^^)

      -
      Edité par epso 27 mars 2015 à 18:08:52

      • Partager sur Facebook
      • Partager sur Twitter
        27 mars 2015 à 18:10:32

        En écrivant ça : QHBoxLayout::layout , c'est comme si tu voulais accéder à un élément spécifique de la classe QHBoxLayout, comme par exemple , un membre static.

        Or, ce n'est pas le cas vu que tu veux seulement utilisé la variable que tu viens de créer donc tu dois seulement retirer les "QHBoxLayout::" de devant ta variable.

        • Partager sur Facebook
        • Partager sur Twitter
          27 mars 2015 à 18:16:14

          Salut,

          Retire, le QHBoxLayout:: de toutes les lignes dans lesquelles tu invoque addWidget.

          Ce qui se passe, c'est que la fonction addwidget est (comme le compilateur te l'indique) une fonction virtuelle, ce qui en fait, forcément, une fonction non statique (comprend : une fonction qui ne peut d'office être appelée qu'au travers d'un objet existant du type adéquat)

          Or, à quelques exceptions près (mais qui n'on rien à voir avec ton problème actuel ;) ) la sytnaxe QHBoxLayout::addLayout est utilisée pour invoquer ce que l'on appelle des fonctions statiques (ou, si tu préfères, des fonctions dont l'utilisation ne dépend d'aucune instance particulière de l'objet).

          Et l'on peut comprendre que le compilateur ne soit pas content : la syntaxe que tu utilise lui fait comprendre qu'il doit utiliser addWidget comme s'il s'agissait d'une fonction statique (qui peut être invoquée même quand on ne dispose pas d'un objet de type QHBoxLayout) alors que la fonction addWidget est tout (ou, disons plutôt : sans doute beaucoup de choses :D ) mais surement pas une fonction statique.

          Du coup, le compilateur "retombe sur ses pattes" de la seule manière qui lui soit autorisée : il s'arrête sur une erreur de compilation ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            27 mars 2015 à 21:45:37

            Super!! ça marche!!! enfin....:)

            @epso: oui, je sais, c'est mon point faible,énorme même!!! J'apprends le C++ à la vitesse d'un escargot à la retraite et donc j'oublie quelques leçons avant. Je dois passer mon temps à réviser...

            Heureusement le cours de ce site est super bien expliqué, et je crayonne le bouquin avec plein de rappels.

            Et quand je quitte le cours en prenant certaines libertés, c'est juste pour voir ce que c'est que programmer ... pour de vrai... et là, ben.. heureusement que vous êtes là!

            Merci à vous tous..  maintenant, faut que je réfléchisse à donf sur vos conseils.

            • Partager sur Facebook
            • Partager sur Twitter

            cannot call member function 'virtual QLayout::

            × 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