Ho appena iniziato a utilizzare Qt e ho notato che tutte le definizioni di esempio di classe hanno la macro Q_OBJECT
come la prima linea. Qual è lo scopo di questa macro del preprocessore?Cosa fa la macro Q_OBJECT? Perché tutti gli oggetti Qt hanno bisogno di questa macro?
risposta
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 .
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.
È 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. –
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'. –
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++
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 **. –
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.
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. –
@KubaOber hai un esempio di codice che compila ma non funziona quando manca la macro 'Q_OBJECT'? – Chris
- 1. Che cosa fa esattamente questa macro?
- 2. Cosa c'è di sbagliato in questa macro?
- 3. Cosa significa questa macro modello C++?
- 4. Problemi con questa macro
- 5. Perché abbiamo bisogno di parentesi attorno alla macro di blocco?
- 6. Impossibile eseguire la macro ... la macro potrebbe non essere disponibile in questa cartella di lavoro
- 7. Preprocessore C Macro di definizione macro
- 8. macro dipendente macro
- 9. Macro in macro
- 10. C'è un vantaggio per questa macro?
- 11. Macro di produzione di macro in C?
- 12. Abbiamo davvero bisogno di una macro di rilascio sicura?
- 13. jinja2: macro selezione macro o chiamate macro dinamiche
- 14. Perché la macro interruzione Q_FOREACH VS2010 potrebbe essere intellisense?
- 15. la definizione di macro container_of
- 16. Perché Qt ha bisogno di allocare oggetti figlio nell'heap?
- 17. Precedenza di -D MACRO e #define MACRO
- 18. Macro che scrivono macro - Errore di compilazione
- 19. Cosa fa questa notazione per gli elenchi in Python: "someList [:]"?
- 20. cos'è la macro% (AdditionalDependencies)?
- 21. Macro elisir: convertire gli atomi in vars
- 22. Errore "impossibile trovare la macro" nel test doc della macro
- 23. Per che cosa è la macro WITH-STANDARD-IO-SYNTAX?
- 24. Cosa fa questa funzione? (Iteratori di Python)
- 25. Posso definire una macro che definisce macro?
- 26. Macro all'interno della macro in C
- 27. Chiamare una macro all'interno di un'altra macro in Twig
- 28. Definire una macro dal contenuto di una macro
- 29. C/C++ #define Macro all'interno della macro?
- 30. ordine di valutazione Macro
QT si riferisce a QuickTime e Qt si riferisce alla libreria C++ chiamato Qt. – Bleadof