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 :

Impossible de mettre la macro Q_OBJECT : 'staticMetaObject' is not a member...


Sujet :

Qt

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut Impossible de mettre la macro Q_OBJECT : 'staticMetaObject' is not a member...
    Pour mes besoins personnels, je voulais dériver la classe QListWidgetItem. Ma classe dérivée est myQListWidgetItem. Voici la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class myQListWidgetItem : public QListWidgetItem
    {
       Q_OBJECT // Objet du litige, genere une erreur
     
    public:
        myQListWidgetItem(QListWidget * parent = 0);
    };

    Dans le constructeur, rien de particulier, je donne juste le QListWidget *parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    myQListWidgetItem::myQListWidgetItem(QListWidget * parent)
        : QListWidgetItem(parent)
    {
         // code du constructeur
    }
    à la compilation, voilà l'erreur :

    1. moc_myqlistwidgetitem.cpp(38) : error C2039: 'staticMetaObject' : is not a member of QListWidgetItem'
    2. moc_myqlistwidgetitem.cpp(52) : error C2039: 'qt_metacast' : is not a member of 'QListWidgetItem'
    3. moc_myqlistwidgetitem.cpp(57) : error C2039: 'qt_metacall' : is not a member of 'QListWidgetItem'


    see declaration of 'QListWidgetItem'
    Moi pas très bien comprendre c'est quoi son problème. Comment je fais pour savoir facilement de quelles classes de base je peux dériver et ajouter la macro Q_OBJECT ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    QListWidgetItem ne dérive pas de QObject.
    la macro Q_OBJECT ne sert qu'avec une class qui hérite directement ou indirectement de QObject

    http://qt.developpez.com/doc/latest/metaobjects.html

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Ayant de nouveau été confronté au problème, je mets à jour le thread avec les liens qui vont bien vers la doc trolltech.

    je pense que la majorité des problèmes viennent du fait que la classe qu'on essaie de faire n'hérite pas de QObject et qu'on a mis la macro Q_OBJECT.
    Il faut donc hérité de QObject, et, très important, c'est que l'héritage de QObject soit le premier dans l'ordre des héritages (c'est mal dit mais on se comprend ).

    Voilà la doc (de moc ) :

    http://qt.developpez.com/doc/latest/moc.html

    Voilà le paragraphe qui nous intéresse :

    Multiple Inheritance Requires QObject to Be First

    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // correct
     class SomeClass : public QObject, public OtherClass
     {
         ...
     };
    Virtual inheritance with QObject is not supported.

    Dans quelles situations cela peut arriver, concretement :

    Dans mon cas j'ai un object QwtPlot3D (allez chercher sur le web).
    Mon souci c'est que cet objet a plein de fonctions comme afficher la grille, mettre de face, mettre en fil de fer, mettre en une seule couleur. Alors, dans cette situation, si on utilise cet objet sur une fiche il faut se debrouiller pour mettre des widgets (boutons) qui lorsqu'on les clique appelle l'une ou l'autre des fonctions.

    Soluce :

    Créer une classe héritant d'un ui dans lequel les boutons sont déjà placés, ayant pour membre un objet 3D qu'elle layout là où ça va bien.

    L'exemple suivant illustre mes propos :

    1. L'objet 3D nu qu'il faut encadrer
    2. Le cadre nu fait sur Qt designer
    3. le resultat final : une classe qui herite de la classe générée par Qt designer ET de 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
    class ObjetTrois3DADonner : public QObject, public Ui::CadreFaitParDesigner
    {
        Q_OBJECT     // Pour connecter les boutons a des slots
     
    public:
        ObjetTrois3DADonner (QWidget *parent = 0);
        ~ObjetTrois3DADonner ();
     
    private:
    	Qwt3D::SurfacePlot *m_Plot;     // Surface de trace (l'objet 3D)
            ...
    private slots:
         slotMetEnFilDeFer();     // slots 
         ...
    };

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut

    le designer permet de créé des class héritant de QWidget et donc de QObject.
    Pourquoi tu as eu besoin d'hériter de QObject??

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    designer ne me crée pas de classe héritant de QWidget

    Je viens de faire un exemple tout simple : fichier nouveau à base de QFrame, voilà le code généré :

    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
    37
    38
    39
    40
     
    QT_BEGIN_NAMESPACE
     
    class Ui_Frame
    {
    public:
        QPushButton *pushButton;
     
        void setupUi(QFrame *Frame)
        {
        if (Frame->objectName().isEmpty())
            Frame->setObjectName(QString::fromUtf8("Frame"));
        Frame->resize(400, 300);
        Frame->setFrameShape(QFrame::StyledPanel);
        Frame->setFrameShadow(QFrame::Raised);
        pushButton = new QPushButton(Frame);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(110, 70, 75, 24));
     
        retranslateUi(Frame);
     
        QMetaObject::connectSlotsByName(Frame);
        } // setupUi
     
        void retranslateUi(QFrame *Frame)
        {
        Frame->setWindowTitle(QApplication::translate("Frame", "Frame", 0, QApplication::UnicodeUTF8));
        pushButton->setText(QApplication::translate("Frame", "PushButton", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(Frame);
        } // retranslateUi
     
    };
     
    namespace Ui {
        class Frame: public Ui_Frame {};
    } // namespace Ui
     
    QT_END_NAMESPACE
     
    #endif // DESIGNERUH3248_H
    Je vois pas où est-ce que j'hérite d'un QObject. Pour moi, la classe généré est seulement une classe qui permet la création d'objets dans un autre objet (ici un QFrame) passé en paramètre.

    Dans l'exemple de la doc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // correct
     class SomeClass : public QObject, public OtherClass
     {
         ...
     };
    mon OtherClass est la classe générée par designer.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    ha je viens de capter, dsl... j'ai mélanger la class et les membres de la class
    pourquoi tu as besoin d'ajouter des signal/slot à une class créé par ui?

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    pourquoi tu as besoin d'ajouter des signal/slot à une class créé par ui?
    La classe générée va foutre des boutons (genre : "Mettre en file de fer").
    Moi, il faut que je fasse une classe, dans laquelle je vais créer ces boutons à des slots, pour ensuite appeler des méthodes de l'objet 3D.
    Le résultat final étant une classe qu'on peut inclure n'importe où, qui possède un objet 3D et déjà des boutons associés pour tirer parti des fonctionnalités.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    ok.
    Perso, j'aurais créé une QWidget qui utilise la class ui.

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Je viens de modifier mon truc. Heritant de QObject et non pas de Widget, je peux difficilement poser mon objet sur un widget

    (la plupart des fonctions attendent un QWidget* (setCentralWidget(QWidget*), addWidget(Qwidget*)) ...

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

Discussions similaires

  1. impossible de mettre à jour recordset
    Par zephyr59 dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2016, 10h02
  2. [HTML] Problème avec DIV, impossible de mettre la hauteur à 100% !!
    Par keyser.greg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 01/03/2007, 11h46
  3. Impossible de mettre a jour les plans de maintenance
    Par sqlakf76 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/11/2006, 18h06
  4. Impossible de mettre à jour un champs
    Par _developpeur_ dans le forum Access
    Réponses: 4
    Dernier message: 23/01/2006, 13h17
  5. Réponses: 6
    Dernier message: 14/02/2003, 16h52

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