web-dev-qa-db-fra.com

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

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?

119
Trevor Boyd Smith

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.

126
Stu Mackellar

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.

16
Martin Beckett

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++.

8
aditya

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.

4
Bob Zhang

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.

0
Andres