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

Qt Discussion :

Hériter de QWidget


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut Hériter de QWidget
    Bonjour j'ai ces messages d'erreurs:
    erreur : expected constructor, destructor, or type conversion before '(' token
    Widget::GlWidget(QObject(*parent)
    mais je n'arrive pas à savoir la ou je me suis trompé
    .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
    #ifndef GLWIDGET_H
    #define GLWIDGET_H
     
    #include <QGLWidget>
    #include<QObject>
     
    class GlWidget : public QGLWidget
    {
        Q_OBJECT
    public:
        explicit GlWidget(QObject *parent=0);
     ~GlWidget();
     
    };
     
    #endif // GLWIDGET_H
    .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "glwidget.h"
     
     
     
    GlWidget::GlWidget(QObject *parent): 
        QGLWidget(parent)
     
    {
    }
    Merci pour votre aide.

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

    Il ne semble pas y avoir d'erreur dans le code que tu montres, par contre on peut apercevoir un ( en trop dans la ligne du message d'erreur :
    Widget::GlWidget(QObject(*parent)
    ainsi que l'absence d'un GlWidget au tout début de la ligne.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Pour tout vous dire je veux utiliser la librairie QGLWidget qui hérite de la classe Q_Object, j'ai voulu le faire manuellement et j'obtiens plusieurs messages d'erreurs.
    La ligne de code que vous avez cité je l'ai supprimé mais l'erreur reviens je ne sais pas ou j'ai pu me tromper voici les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    erreur : cannot call member function 'virtual void* QGLWidget::qt_metacast(const char*)' without object
         return QGLWidget::qt_metacast(_clname);
                                              ^
     
     erreur : cannot call member function 'virtual int QGLWidget::qt_metacall(QMetaObject::Call, int, void**)' without object
         _id = QGLWidget::qt_metacall(_c, _id, _a);
                                                 ^
     erreur : expected constructor, destructor, or type conversion before '(' token
     Widget::GlWidget(QObject(*parent)
                     ^
     
    erreur : out-of-line definition of 'GlWidget' does not match any declaration in 'GlWidget'

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le code que tu donnes ne correspond pas à l'erreur affichée, ce qui va rendre les choses particulièrement difficiles pour t'apporter une réponse

    C'est, d'ailleurs, assez marrant parce que, pour une fois, l'erreur que tu as faite en recopiant ton code fournit --justement -- la réponse à ton problème: si tu remplace la ligne correspondant à la ligne 11 du code que tu nous nomtre de ton fichier d'en-tête (*.h) par celle que tu nous montre à la même ligne ici et que tu remplace, dans le fichier d'implémentation (*.cpp) la ligne correpondant à la ligne cinq que tu montre ici par celle que tu nous montre, ton problème sera résolu

    Mais, pour te permettre de comprendre le problème, il suffit de lire le message d'erreur: il te parle de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Widget::GlWidget(QObject(*parent)
    Ben, de fait, tu as écrit Widget au lieu de GlWidget au tout début de la ligne : la définition d'un constructeur de classe utilise le nom de la classe (GlWidget, dans le cas présent) des deux côté de l'opérateur de portée (les :: qui séparent les deux noms).

    Mais il y avait une deuxième erreur au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlWidget(QObject(*parent)
    Comme tu peux le remarquer, tu ouvre deux parenthèses: l'un juste après le nom de la classe GlWidget, et l'autre juste après le mot QObject, mais tu n'en ferme qu'une seule, ce qui implique déjà qu'il y en a forcément une de trop (ou une trop peu), car les parenthèses (ainsi d'ailleurs que les accolades) fonctionent toujours par paire: si on ouvre une parenthèse d'un coté, elle doit être fermée de l'autre

    Dans le cas présent, c'est la parenthèse qui suit le mot QObject (et qui précède * parent) qui est de trop, car la paire de parenthèse a ici pour but d'indiquer la liste des paramètres qui doivent être fournis à la fonction.

    Or, pour chaque paramètre fourni à la fonction, il faut indiquer:
    1. le type de la donnée qui sera transmise (QObject)
    2. le fait que la donnée sera transmise sous forme de pointeur (*) (1)
    3. le nom à travers lequel on pourra accéder à la donnée en question (parent)

    Et ces trois éléments ne peuvent être séprarés par rien (2) !
    tu dois donc avoir:
    la parenthèse ouvrante ( qui indique le début de la liste des paramètres attendus par la fonction
    le paramètre QObject * parentla parenthèse fermante ), indiquant la fin de la liste des paramètres attendus par la fonction

    (1)Bon, le passage par pointeur est une habitude propre à Qt, tu pourrais tout aussi bien trouver une esperluette & indiquant que le paramètre est transmis par référence, ou carrément, rien du tout, indiquant que le paramètre est transmis par valeur...

    Si ce que je t'explique te semble obscure, n'hésite pas à relire ton cours, ou à poser des questions
    (2) là aussi je simplifie un peu les choses, car on pourrait intercaler le mot clé const de ci ou de là... Mais pas dans le cas présent
    Au final, le code que tu dois donc avoir prend bien la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <nom_de_la_classe> :: <nom_de_la_classe> ( <liste_de_parametres>)
    <nom_de_la_classe> correspond à chaque fois (dans le cas qui nous intéresse) à GlWidget et ou <lise_de_parametres> corrspond à QObject * parent.

    Et, du coup, ton code doit bel et bien prendre la forme de GlWidget::GlWidget(QObject * parent) qui est, justement, le code que tu nous a montré ici
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Je vous remercie de m'éclairer un peu, je commence a comprendre un peu mieux

    j'ai changé les lignes qui me posait problème dans mon fichier cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "glwidget.h"
    #include"QGLWidget"
     
     
    GlWidget::GlWidget(QObject *parent): 
        QGLWidget(parent)
     
    {
    }
    Mais j'obtiens toujours des erreurs, je ne sais pas ce que je dois modifier dans mon (.h) voici les 2 erreurs qui me restent après ce changement

    erreur : prototype for 'GlWidget::GlWidget(QObject*)' does not match any in class 'GlWidget'
     GlWidget::GlWidget(QObject *parent):
     ^~~~~~~~
     erreur : candidates are: GlWidget::GlWidget(const GlWidget&)
     class GlWidget : public QGLWidget
           ^~~~~~~~

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si l'on considère le contenu du .h donné dans le premier message, là encore le message d'erreur ne correspond pas.
    As-tu modifié la ligne explicit GlWidget(QObject *parent=0); depuis ?

    Remarque, en jetant un coup d'œil à la documentation de la classe QGLWidget, je reviens sur ce que j'ai dit. Il y a en fait une erreur dans le code (mais pas liée à celles que tu montres) : la classe QGLWidget prend en paramètre constructeur un QWidget * et non pas un QObject *. Ta classe doit donc faire de même.

    Toutefois, on peut également y voir ceci :
    This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.

    [...]

    Note: This class is part of the legacy Qt OpenGL module and, like the other QGL classes, should be avoided in the new applications. Instead, starting from Qt 5.4, prefer using QOpenGLWidget and the QOpenGL classes.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    en créant la classe il était dis que la "Base class: QGLWidget" héritais de la classe Q_Object. Oui je n'ai pas changer ce qu'il y a dans le .h mon code ressemble a ça

    .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
    #ifndef GLWIDGET_H
    #define GLWIDGET_H
     
    #include <QGLWidget>
    #include<QObject>
     
    class GlWidget : public QGLWidget
    {
        Q_OBJECT
    public:
        explicit GlWidget(QWidget *parent=0);
     ~GlWidget();
     
    };
     
    #endif // GLWIDGET_H
    .CPP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GlWidget::GlWidget(QObject *parent):
        QGLWidget(parent)
     
    {
    }

  8. #8
    Invité
    Invité(e)
    Par défaut
    Elle hérite en effet de QObject, par le biais de QWidget. Mais QGLWidget tout comme son descendant direct QWidget prennent un QWidget * comme parent dans leur paramètre constructeur. (Tu peux le voir dans leur documentation : QGLWidget / QWidget). Tu pourrais leur passer sans problème le pointeur d'une classe qui hériterait de QWidget, mais tu ne peux pas passer un pointeur sur une classe parente comme ici QObject.

    Alors tu as correctement modifié la ligne explicit GlWidget(QWidget *parent=0);, pour remplacer QObject par QWidget, mais il te faut reporter également cette modification dans son implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GlWidget::GlWidget(QWidget *parent):
        QGLWidget(parent)
     
    {
    }

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour le temps que vous me consacrer et pour les réponses pertinentes que vous me donner. J'ai un dernier soucis de debug cela doit venir de l'implémentation des librairies?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QT       += core gui opengl
    LIBS     += -lopengl32 -glu32
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

    :-1: erreur : error: unrecognized debug output level 'lu32'

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas un souci de « debug », c'est juste que le compilateur voit une option qui débute par -g et l'interprète comme étant une option liée au débogage.
    Il te manque le « l » (pour library) devant glu32 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIBS     += -lopengl32 -lglu32

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Merci pour votre patience et votre pédagogie tout fonctionne

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

Discussions similaires

  1. Hériter de QWidget depuis QGLWidget
    Par jim53 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/09/2013, 11h39
  2. Hériter de TList
    Par NotANumber dans le forum Langage
    Réponses: 10
    Dernier message: 23/11/2005, 18h35
  3. Hériter de TList
    Par NotANumber dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 22/11/2005, 18h03
  4. Réponses: 2
    Dernier message: 05/07/2005, 18h22
  5. Réponses: 7
    Dernier message: 25/03/2005, 14h05

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