Che cosa fa la macro Q_OBJECT? Perché tutti gli oggetti Qt hanno bisogno di questa macro?

Ho appena iniziato a utilizzare Qt e ho notato che tutte le definizioni di class di esempio hanno la macro Q_OBJECT come prima riga. Qual è lo scopo di questa macro del preprocessore?

Dalla documentazione Qt :

Il Meta-Object Compiler, moc, è il programma che gestisce le estensioni C ++ di Qt.

Lo strumento moc legge un file di intestazione C ++. Se trova una o più dichiarazioni di class che contengono la macro Q_OBJECT, produce un file sorgente C ++ contenente il codice meta-object per tali classi. Tra le altre cose, il codice meta-object è richiesto per il meccanismo di segnali e slot, le informazioni sul tipo di esecuzione e il sistema di proprietà dinamico.

Semplicemente dice al pre-compilatore che questa class ha elementi di GUI e deve essere eseguita attraverso il ‘moc’, basta aggiungerla alle classi che usano il meccanismo segnale / slot.
Ma sarà tranquillamente ignorato in qualsiasi altra class – aggiunge solo al tempo di costruzione.

Il MOC (meta object compiler) converte la macro Q_OBJECT inclusa nei file header in codice sorgente C ++ equivalente. In pratica controlla il meccanismo dello slot del segnale e lo rende comprensibile al compilatore C ++

La macro Q_OBJECT deve apparire nella sezione privata di una definizione di class che dichiara i propri segnali e slot o che utilizza altri servizi forniti dal sistema meta-object di Qt.

1 Dalla documentazione Qt di The Meta-Object System

Lo strumento moc legge un file sorgente C ++. Se trova una o più dichiarazioni di class che contengono la macro Q_OBJECT, produce un altro file sorgente C ++ che contiene il codice meta-object per ciascuna di queste classi. Questo file sorgente generato è # include’d nel file sorgente della class o, più spesso, compilato e collegato all’implementazione della class.

2 Dalla documentazione Qt di THE Q_OBJECT

La macro Q_OBJECT deve apparire nella sezione privata di una definizione di class che dichiara i propri segnali e slot o che utilizza altri servizi forniti dal sistema meta-object di Qt.

3 Dalla documentazione Qt di moc

Lo strumento moc legge un file di intestazione C ++. Se trova una o più dichiarazioni di class che contengono la macro Q_OBJECT, produce un file sorgente C ++ contenente il codice meta-object per tali classi. Tra le altre cose, il codice meta-object è richiesto per il meccanismo di segnali e slot, le informazioni sul tipo di esecuzione e il sistema di proprietà dinamico.

4 Dalla documentazione Qt di segnali e slot

La macro Q_OBJECT viene espansa dal preprocessore per dichiarare diverse funzioni membro implementate dal moc; se si verificano errori del compilatore sulla falsariga di “riferimento non definito a vtable per LcdNumber”, probabilmente si è dimenticato di eseguire il moc o di includere l’output moc nel comando link.