web-dev-qa-db-fra.com

Classes de base non Qt

J'utilise Qt (que je connais pour la première fois) 4.8.2, avec Visual Studio, et j'ai créé une classe de base nommée "Contact". Je ne veux pas que cette classe soit exclusive à Qt , mon intention était donc de créer une autre classe "QContact" qui héritera de "Contact", de QObject et traitera toutes les activités liées à Qt, telles Q_OBJECT macro etc.

Malheureusement, lorsque j'ai hérité, la construction a échoué en disant:

moc_QContact.cpp(53): error C2039: 'staticMetaObject' : is not a member of 'Contact'
moc_QContact.cpp(75): error C2039: 'qt_metacast' : is not a member of 'Contact'
moc_QContact.cpp(80): error C2039: 'qt_metacall' : is not a member of 'Contact'

J'ai fait une petite recherche sur le Web et découvert que vous ne pouvez pas dériver une classe Qt d'une classe non-Qt. donc pour le réparer, "Contact" pourrait hériter de "QObject" (j'ai essayé, cela a fonctionné). mais cela le rendra exclusif à Qt qui est mon problème.

Donc, ce que je demande est la suivante: comment pouvez-vous créer une classe de base non Qt pour une classe Qt?

Je vous remercie.

40
MasterMastic

Vous pouvez dériver votre classe de QObject et d'autres classes qui n'en dérivent pas, mais QObject doit être la première classe de base dans la liste des classes de base. 

Donc c'est faux:

class QContact: public Contact, public QObject {};

Vous devez l'écrire comme

class QContact: public QObject, public Contact {};
80

From Introduction à la conception de tapis en C++ avec Qt Chapitre 8.4:

Pour vous assurer que moc traite Chaque classe dérivée de QObject du projet, voici quelques instructions pour l'écriture: Le code C++ et les fichiers de projet qmake:

• Chaque définition de classe doit aller dans son propre fichier .h.

• Son implémentation devrait aller dans un fichier .cpp correspondant.

• Le fichier d’en-tête doit être «encapsulé» (par exemple, avec #ifndef) pour éviter les inclusions multiples. .

• Chaque fichier d'en-tête doit être répertorié dans la variable HEADERS du fichier .pro . Sans cela, moc ne procédera pas au prétraitement du fichier.

• La macro Q_OBJECT doit figurer dans la définition de classe de chaque fichier d'en-tête QObject Dérivé afin que moc sache générer le code correspondant.

0
Enrique Hernandez