Je viens de commencer à utiliser Qt et j'ai remarqué que toutes les définitions de classe données en exemple ont la macro Q_OBJECT
comme première ligne. Quel est le but de cette macro de préprocesseur?
De la documentation Qt :
Le compilateur de méta-objets, moc, est le programme qui gère les extensions C++ de Qt.
L'outil moc lit un fichier d'en-tête C++. S'il trouve une ou plusieurs déclarations de classe contenant la macro Q_OBJECT, il génère un fichier source C++ contenant le code de méta-objet pour ces classes. Entre autres choses, le code de méta-objet est requis pour le mécanisme des signaux et des emplacements, les informations de type à l'exécution et le système de propriétés dynamiques.
Cela indique simplement au pré-compilateur que cette classe a des éléments graphiques et qu'elle doit être exécutée via le 'moc'; vous devez uniquement l'ajouter aux classes qui utilisent le mécanisme signal/slot.
Mais il sera discrètement ignoré dans toutes les autres classes - cela ajoute simplement au temps de construction.
Le MOC (méta-objet compilateur) convertit les fichiers d'en-tête inclus dans la macro Q_OBJECT en code source C++ équivalent. Fondamentalement, il contrôle le mécanisme signal-slot et le rend compréhensible pour le compilateur C++.
1 D'après la documentation Qt de le système de méta-objets
L'outil moc lit un fichier source C++. S'il trouve une ou plusieurs déclarations de classe contenant la macro Q_OBJECT, il génère un autre fichier source C++ contenant le code de méta-objet pour chacune de ces classes. Ce fichier source généré est soit # inclus dans le fichier source de la classe, soit, plus généralement, compilé et lié à l'implémentation de la classe.
2 D'après la documentation Qt de THE Q_OBJECT
La macro Q_OBJECT doit apparaître dans la section privée d'une définition de classe qui déclare ses propres signaux et emplacements ou qui utilise d'autres services fournis par le système de méta-objets de Qt.
3 D'après la documentation Qt de moc
L'outil moc lit un fichier d'en-tête C++. S'il trouve une ou plusieurs déclarations de classe contenant la macro Q_OBJECT, il génère un fichier source C++ contenant le code de méta-objet pour ces classes. Entre autres choses, le code de méta-objet est requis pour le mécanisme des signaux et des emplacements, les informations de type à l'exécution et le système de propriétés dynamiques.
4 D'après la documentation Qt de signaux et emplacements
La macro Q_OBJECT est développée par le préprocesseur pour déclarer plusieurs fonctions membres implémentées par le moc; Si vous obtenez des erreurs de compilation du type "référence non définie à vtable pour LcdNumber", vous avez probablement oublié d'exécuter le moc ou d'inclure la sortie moc dans la commande link.
La macro Q_OBJECT doit apparaître dans la section privée d'une définition de classe qui déclare ses propres signaux et emplacements ou qui utilise d'autres services fournis par le système de méta-objets de Qt.