Que fait la macro Q_OBJECT? Pourquoi tous les objects Qt ont-ils besoin de cette macro?

J’ai juste commencé à utiliser Qt et j’ai remarqué que toutes les définitions de classes d’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-objects, 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 du méta-object pour ces classes. Entre autres choses, le code de méta-object est requirejs pour le mécanisme de signaux et de logements, les informations de type à l’exécution et le système de propriétés dynamic.

Il indique simplement au pré-compilateur que cette classe contient des éléments d’interface graphique et doit être exécutée via le “moc”. Il vous suffit de l’append aux classes utilisant le mécanisme signal / emplacement.
Mais il sera discrètement ignoré dans les autres classes – cela ne fait qu’append au temps de construction.

Le MOC (compilateur d’object méta) convertit les fichiers d’en-tête inclus de la macro Q_OBJECT en code source équivalent C ++. Il contrôle fondamentalement le mécanisme de signal-slot, et le rend compréhensible pour le compilateur C ++

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-objects de Qt.

1 De la documentation Qt du système de méta-object

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 du méta-object 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 De 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-objects de Qt.

3 De 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 du méta-object pour ces classes. Entre autres choses, le code de méta-object est requirejs pour le mécanisme de signaux et de logements, les informations de type à l’exécution et le système de propriétés dynamic.

4 De la documentation Qt des signaux et des slots

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 telles que “référence indéfinie à vtable pour LcdNumber”, vous avez probablement oublié d’exécuter le moc ou d’inclure la sortie moc dans la commande link.