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

 C++ Discussion :

Héritage de QWidget échoué !


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Héritage de QWidget échoué !
    J'ai voulu créer une classe héritée de QWidget pour m'exercer...mais la fonction show() ne fonctionne pas.
    Error : request for member 'show' in 'fenetre', which is non-class type 'MaFenetre()'
    Le code :
    MeFenetre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef MAFENETRE_H
    #define MAFENETRE_H
     
    #include <QWidget>
    #include <QLCDNumber>
    #include <QSlider>
     
    class MaFenetre : public QWidget
    {
    public:
        MaFenetre();
    private:
        QLCDNumber *m_lcd;
        QSlider *m_slider;
    };
     
     
    #endif // MAFENETRE_H
    MaFenetre.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mafenetre.h"
     
    MaFenetre::MaFenetre() :QWidget()
    {
        setFixedSize(200,100);
        m_lcd=new QLCDNumber(this);
        m_lcd->setSegmentStyle(QLCDNumber::Flat);
        m_lcd->move(50,20);
        m_slider=new QSlider(Qt::Horizontal,this);
        m_slider->setGeometry(10,60,150,20);
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <QApplication>
    #include <QPushButton>
    #include <QObject>
     
    #include "mafenetre.h"
     
    int main(int argc,char *argv[])
    {
        QApplication app(argc,argv);
        MaFenetre fenetre();
        fenetre.show(); //ici il y a une erreur !
        return app.exec();
    }
    et le .pro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    QT+= widgets
     
    SOURCES += \
        main.cpp \
        mafenetre.cpp
     
    HEADERS += \
        mafenetre.h
    Merci d'avance pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cette ligne MaFenetre fenetre(); déclare une fonction qui ne prend aucun argument et retourne un objet MaFenetre.
    Enlève les parenthèses à la fin et ça ira mieux

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement ça fonctionne mais c'est bizarre, j'ai toujours déclaré mes objets comme ça quand j'utilisais le constructeur par défaut...
    Enfin, merci quand même.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Ce que tu faisais, qui ressemble, est plutot: MaFenetre fenetre = MaFenetre();.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Non...Dans un programme j'avais créé, entre autres, un classe "Personnage" et quand je faisais
    Personnage J1(nomJ1,xpJ1);
    Ça fonctionnait très bien...est-ce parce qu'il y a des arguments ?

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Précisément.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ok, ça je m'en souviendrais, merci.

    Maintenant j'ai un autre problème, alors que j'essayais de créer un nouveau slot ; il me sort "undefined reference to 'vtable for MaFenetre'".
    MaFenetre.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #ifndef MAFENETRE_H
    #define MAFENETRE_H
     
    #include <QWidget>
    #include <QSlider>
     
    class MaFenetre : public QWidget //une erreur ici...en double ?!
    {
        Q_OBJECT
    public:
        MaFenetre();
    public slots:
        void changerLargeur(int largeur);
    private:
        QSlider *m_slider;
    };
     
     
    #endif // MAFENETRE_H
    MaFenetre.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "mafenetre.h"
     
    MaFenetre::MaFenetre() :QWidget() //la même erreur ici, en double encore...pourquoi il me met deux fois exactement le même code d'erreur sur la même ligne ?
    {
        setFixedSize(200,100);
        m_slider=new QSlider(Qt::Horizontal,this);
        m_slider->setRange(200,600);
        m_slider->setGeometry(10,60,150,20);
        QObject::connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(changerLargeur(int)));
    }
    void MaFenetre::changerLargeur(int largeur)
    {
        setFixedSize(largeur,100);
    }
    Le main n'a pas changé.

    Il me semble que cette erreur se pointe quand on a une fonction virtuelle n'ayant pas de corps, mais je ne connais pas encore très bien Qt...Quelles sont ces méthodes de QWidget qui poseraient problème ?

    Merci d'avance.


    EDIT : J'ai nettoyé le projet, réexécuté qmake et recompilé le programme, et là ça marche. Sujet résolu, merci à tous !

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    undefined vtable, c'est quand la classe de base ne possède aucune fonction virtuelle avec un corps.
    La solution est de définir le destructeur (s'il est virtuel) ou une autre fonction.

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai dû faire l'EDIT pendant que tu écrivais ta réponse, désolé ^^'
    Le problème ne venait pas de là, il fallait juste nettoyer le projet. Ceci fait ça fonctionne et sans avoir modifié le code. Mais merci quand même !

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

Discussions similaires

  1. Problème d'héritage de QWidget
    Par squallmrs dans le forum Qt
    Réponses: 3
    Dernier message: 11/10/2010, 02h38
  2. Multi-héritage de QWidget
    Par scheme dans le forum Qt
    Réponses: 5
    Dernier message: 03/09/2010, 10h56
  3. Multi héritage Qt -> multi héritage de QWidget ?
    Par gassi64 dans le forum Débuter
    Réponses: 2
    Dernier message: 24/07/2009, 11h33
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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