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 :

[Qt 4.4.1] Utilisation de Q_OBJECT dans une classe abstraite et ses dérivées


Sujet :

Qt

  1. #1
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut [Qt 4.4.1] Utilisation de Q_OBJECT dans une classe abstraite et ses dérivées
    Bonjour,

    je pose là une question à laquelle mon niveau ne permet pas de répondre (sinon je posterais pas hein )

    Je commence l'explication du problème en mode texte, les plus courageux pourront jeter un coup d'oeil au code après (toi qui te sens si bon, avant de sauter au code lis donc ici quand même )

    1ere partie : Ze probleume :

    1) Je crée une classe Abstraite nommée virtualSensor
    2) Dans cette classe je mets la macro Q_OBJECT
    3) Je mets aussi uniquement des méthode virtuelles pures qu'on appelera A et B.
    4) je crée une classe sensorX, qui dérive de virtualSensor.
    5) sensorX réimplémente les méthodes virtuelles A et B ainsi qu'un QComboBox et un slot C
    (le QComboBox n'est qu'un exemple)
    6) Quelque part dans la définition de A ou B, je connecte le signal du QComboBox à mon slot C(celui de ma classe sensorX).
    7) Tout compile sans erreurs ni warnings.
    8) A l'execution en debug, je me rends compte que le connect(signal QCombobox à slot C de sensorX) ne fonctionne pas, le message étant que le slotC n'appartient pas à virtualSensor.

    Mes questions : en quoi le fait que virtualSensor possède Q_OBJECT et pas sensorX influe-t-il sur ce genre de situation ? Pourquoi connect est allé chercher le slot C dans la classe virtualSensor et pas dans sensorX ?

    Vous allez me dire : Mets Q_OBJECT dans sensorX et pas dans la virtualSensor !
    Si je fais ça, ça ne compile pas (erreurs dans les moc_*), j'ai les messages suivants (j'abrège) :

    warning C4273: 'staticMetaObject' : inconsistent dll linkage
    error C2491: 'QWidget::staticMetaObject' : definition of dllimport static data member not allowed
    error C2509: 'qt_metacall' : member function not declared in 'virtualSensor'
    Ma solution pour que ça fonctionne est de mettre Q_OBJECT dans virtualSensor ET dans sensorX.


    1ere partie : Ze code :

    Finalement, après réflexion je trouve que j'ai suffisament bien expliqué pour ne pas mettre de code
    Pour ceux que ça intéresse, voilà ce qu'il y a dans la macro Q_OBJECT :
    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
    #define Q_OBJECT \
    public: \
        Q_OBJECT_CHECK \
        static const QMetaObject staticMetaObject; \
        virtual const QMetaObject *metaObject() const; \
        virtual void *qt_metacast(const char *); \
        QT_TR_FUNCTIONS \
        virtual int qt_metacall(QMetaObject::Call, int, void **); \
    private:
    /* tmake ignore Q_OBJECT */
    #define Q_OBJECT_FAKE Q_OBJECT
    /* tmake ignore Q_GADGET */
    #define Q_GADGET \
    public: \
        static const QMetaObject staticMetaObject; \

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par MacPro Voir le message
    1ere partie : Ze probleume :

    1) Je crée une classe Abstraite nommée virtualSensor
    2) Dans cette classe je mets la macro Q_OBJECT
    Malheureusement, regarde ici :
    http://qt.developpez.com/doc/4.4/moc/#moc

    cherche Limitations et Multiple Inheritance Requires QObject to Be First

  3. #3
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Humm...J'ai pas tout compris

    Moi j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class virtualSensor : public QWidget
    {
    	Q_OBJECT
         // reste (methodes virtuelles pures)
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class sensorX : public virtualSensor, public Ui::stackSensorCHR
    {
    	Q_OBJECT
         // reste definition des méthode virtuelles
    }
    Est-ce que mon problème se situe là sachant que que ma first inherited class c'est un QWidget et non un QObject ?

    If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.
    Ou est-ce que mon problème est plutôt dû à ça ? :

    Virtual inheritance with QObject is not supported.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut

    alors j'ai pas compris ta question
    Peut tu mettre un bout de code?

  5. #5
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Ouais, je peux faire ça mais pas dans l'immédiat, je reviens poster dès que je peux.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par MacPro Voir le message
    Ma solution pour que ça fonctionne est de mettre Q_OBJECT dans virtualSensor ET dans sensorX.
    J'avais mélangé abstraite et template
    Donc, tu n'as pas le choix de faire cela car, moc génère du code C++ qui va appeler des fonctions que doivent être propre à la première class parent.
    Comme par exemple pour faire des cast avec qobject_cast

    mais cela n'explique pas ton problème de compilation
    chez moi ça marche
    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
    20
    21
    22
    23
    24
    25
    26
    27
    #include <QtGui>
     
    class A :public QWidget
    {
        public  :
        A()
        {
     
        }
    };
     
     
    class B : public A
    {
        Q_OBJECT
        public:
        B(){};
    };
     
    #include "main.moc"
    int  main(int argc,char**argv)
    {
        QApplication app(argc,argv);
        A a;
        B c;
        return 0;
    }

  7. #7
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Salut, j'allais poster un bout de code mais puisque tu t'y est pris d'avance ...
    chez moi ça compile aussi mais seulement en debug, si bien que les erreurs citées sont ... en release.

    Dans ton exemple, est-ce que tu peux rendre ta classe A virtuelle pure en lui mettant au moins une méthode virtuelle pure ?Ensuite, est-ce que tu peux reimplementer cette méthode en B, et aussi dans B rajouter une méthode qui n'existe que dans B. Puis après est-ce que tu peux faire une connection dans ton B de B à B (c'est mal dit mais on se comprend) ?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par MacPro Voir le message
    Dans ton exemple, est-ce que tu peux rendre ta classe A virtuelle pure en lui mettant au moins une méthode virtuelle pure ?Ensuite, est-ce que tu peux reimplementer cette méthode en B, et aussi dans B rajouter une méthode qui n'existe que dans B. Puis après est-ce que tu peux faire une connection dans ton B de B à B (c'est mal dit mais on se comprend) ?

  9. #9
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Ouais en fait, dans ton exemple, on ne retrouve pas exactement les memes conditions que moi, il faudrait que A soit virtuelle (je sais pas si c'est le cas tel quel). J'ai modifié ton exemple :

    #include <QtGui>

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    class A :public QWidget
    {
        public  :
        A()
        {
     
        }
         virtual void useless(void) = 0;
    };
     
     
    class B : public A
    {
        Q_OBJECT
    public:
        B(){createWidget();};
         virtual void useless(void) { return;};   // ne fais rien
         QComboBox *comboBoite;
         void createWidgets();
         int slotUsefull(int index) {return (index+1);};
    };
    
    void B::createWidgets()
    {
         comboBoite = new QComboBox(this);
         connect(comboBoite, SIGNAL(currentIndexChanged(int), this, SLOT(slotUsefull(int)));
    } 
    
    #include "main.moc"
    int  main(int argc,char**argv)
    {
        QApplication app(argc,argv);
        A a;
        B c;
        return 0;
    }

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par MacPro Voir le message
    Ouais en fait, dans ton exemple, on ne retrouve pas exactement les memes conditions que moi, il faudrait que A soit virtuelle (je sais pas si c'est le cas tel quel). J'ai modifié ton exemple :
    Ton code compile en debug et release...
    Au final j'ai pas compris ton problème

  11. #11
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    AH? mystère alors, je comprends pas non plus. A la trappe le thread alors.

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

Discussions similaires

  1. [IDE] Utiliser un composant dans une classe sans IHM
    Par Pascale38 dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/08/2011, 13h16
  2. utiliser des tableaux dans une class
    Par artemis93 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/04/2011, 11h45
  3. Q_OBJECT dans une classe heritant de QFrame
    Par toams69 dans le forum Qt
    Réponses: 1
    Dernier message: 07/12/2009, 00h19
  4. utilisation d'objet dans une class
    Par turican2 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2009, 15h43
  5. Utilisation de EnumChildWindows dans une class
    Par davels dans le forum Langage
    Réponses: 5
    Dernier message: 31/07/2007, 21h59

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