2009-09-02 9 views

risposta

110

Dal Qt documentation:

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

Lo strumento moc legge un C++ file di intestazione. Se ne trova uno o più classe dichiarazioni che contengono la Q_OBJECT macro, si produce un C++ file sorgente contenente il codice meta-oggetto per quelle classi. Tra le altre cose, codice meta-oggetto è necessario per la segnali e slot meccanismo, il informazioni sul tipo di run-time, e il sistema di proprietà dinamica .

14

Indica semplicemente al pre-compilatore che questa classe ha elementi di interfaccia grafica e deve essere eseguita attraverso il 'moc', è sufficiente aggiungerla alle classi che utilizzano il meccanismo segnale/slot.
Ma sarà ignorata tranquillamente in tutte le altre classi - si aggiunge solo per il tempo di costruzione.

+0

È anche falso che ne hai bisogno solo su classi che usano il meccanismo segnale/slot. L'assenza di 'Q_OBJECT' spezza il' qobject_cast' e l'introspezione. Può portare a un comportamento perplesso, quindi è una cattiva idea. –

+0

Non è vero che 'Q_OBJECT' sarà" tranquillamente "ignorato in qualsiasi altra classe (non' QObject'). Secondo lo standard C++, introduce un comportamento indefinito dichiarando diverse funzioni membro e variabili che non vengono mai definite. Inoltre, inquina lo spazio dei nomi della classe con membri specifici di "QObject". Per esempio. un 'Q_OBJECT' potrebbe interrompere una classe non correlata che contiene un metodo chiamato' metaObject'. –

7

La MOC (oggetto compilatore meta) converte i macro inclusi file di intestazione Q_OBJECT a codice sorgente equivalente C++. In pratica controlla il meccanismo dello slot del segnale e lo rende comprensibile al compilatore C++

+0

Questo è falso: la macro 'Q_OBJECT' è espansa dal compilatore, moc non è necessario per quello. Il moc non fa nulla con la macro stessa, ma genera le ** definizioni ** delle variabili membro e dei metodi che la macro 'Q_OBJECT' ha ** dichiarato **. –

1

La macro Q_OBJECT deve apparire nella sezione privata di una definizione di classe che dichiara i propri segnali e slot o che utilizza altri servizi forniti da Qt's sistema meta-oggetto.

+0

Questo è fuorviante: la macro 'Q_OBJECT' deve apparire in ogni classe che deriva da' QObject'. Il tuo codice sarà rotto in modo impercettibile quando la macro è assente, e solo perché capita di compilare non lo fa bene. –

+0

@KubaOber hai un esempio di codice che compila ma non funziona quando manca la macro 'Q_OBJECT'? – Chris

Problemi correlati