Acabo de empezar a usar Qt y noté que todas las definiciones de clase de ejemplo tienen la macro Q_OBJECT
como primera línea. ¿Cuál es el propósito de esta macro de preprocesador?¿Qué hace la macro Q_OBJECT? ¿Por qué todos los objetos Qt necesitan esta macro?
Respuesta
Desde el Qt documentation:
El Meta-Objeto del compilador, moc, es el programa que se encarga de C++ extensiones de Qt.
La herramienta moc lee un archivo de encabezado C++. Si encuentra una o más declaraciones de clase que contienen la macro Q_OBJECT , produce un archivo fuente C++ que contiene el código de metaobjeto para esas clases. Entre otras cosas, se requiere el código de metaobjeto para el mecanismo de señales y ranuras , la información de tipo de tiempo de ejecución y el sistema de propiedad dinámica .
Simplemente le dice al precompilador que esta clase tiene elementos gui y necesita ejecutarse a través del 'moc', solo necesita agregar esto a las clases que usan el mecanismo de señal/ranura.
Pero se ignorará silenciosamente en cualquier otra clase, solo se agrega al tiempo de compilación.
También es falso que solo lo necesite en las clases que usan el mecanismo de señal/ranura. La ausencia de 'Q_OBJECT' rompe el' qobject_cast' y la introspección. Puede llevar a un comportamiento desconcertante, por lo que es una mala idea. –
No es verdad que 'Q_OBJECT' se ignorará" silenciosamente "en ninguna otra clase (que no sea' QObject'). De acuerdo con el estándar C++, introduce un comportamiento indefinido al declarar varias funciones miembro y variables que nunca se definen. También contamina el espacio de nombres de su clase con miembros específicos de 'QObject'. P.ej. un 'Q_OBJECT' puede romper una clase no relacionada que contiene un método llamado' metaObject'. –
El MOC (compilador de metaobjetos) convierte los archivos de encabezado incluidos en la macro Q_OBJECT en un código fuente equivalente a C++. Básicamente controla el mecanismo de ranura de señal, y lo hace comprensible para el compilador de C++
Eso es falso: la macro 'Q_OBJECT' está expandida por el compilador, moc no es necesario para eso. El moc no hace nada con la macro en sí, pero genera las ** definiciones ** de las variables miembro y los métodos que la macro 'Q_OBJECT' ha declarado **. –
La macro Q_OBJECT debe aparecer en la sección privada de una definición de clase que declara sus propias señales y ranuras o que utiliza otros servicios proporcionados por Qt's sistema de metaobjetos.
Esto es engañoso: la macro 'Q_OBJECT' debe aparecer en cada clase que se deriva de' QObject'. Su código se romperá sutilmente cuando la macro esté ausente, y solo porque se compila no lo hace correcto. –
@KubaOber ¿tiene un ejemplo de código que se compila pero no funciona cuando falta la macro 'Q_OBJECT'? – Chris
- 1. ¿Qué hace la macro Q_D en Qt
- 2. ¿Qué define esta macro?
- 3. ¿Por qué SDL define la macro principal?
- 4. ¿Qué está haciendo exactamente esta macro?
- 5. Por qué compilador se quejan de esta declaración macro
- 6. QT: clase Q_OBJECT templada
- 7. Problema con esta macro
- 8. ¿qué es la macro% (AdditionalDependencies)?
- 9. ¿Por qué stdarg.h tiene una macro «__va_size»?
- 10. ¿Por qué los objetos de transferencia necesitan implementar Serializable?
- 11. ¿Por qué hay tantos paréntesis en la macro ÉXITO?
- 12. ¿Por qué la macro 'max' se define así en C?
- 13. macro macro dependiente
- 14. ¿Por qué hay una macro que define _tmain?
- 15. ¿Por qué falla esta macro de recuento de argumentos variados con VC++?
- 16. ¿Qué hace esta función?
- 17. ¿Por qué es necesario el signo @ en esta definición de macro?
- 18. ¿Por qué necesitamos paréntesis alrededor de macro de bloque?
- 19. Ampliación de macro y stringification: ¿Cómo se hace el nombre de la macro (no su valor) con otra macro?
- 20. Preprocesador C Macro que define Macro
- 21. ¿Por qué esta aplicación Qt simple no vincula
- 22. Qt SDK, Apwrapper: qué es, qué hace.
- 23. ¿Para qué es la macro WITH-STANDARD-IO-SYNTAX?
- 24. ¿Qué hace esta asignación dinámica?
- 25. Qt, CMake, Visual Studio y Q_OBJECT en archivos cpp
- 26. Ejecutar una macro en todos los buffers en vim
- 27. macro - abrir todos los archivos en una carpeta
- 28. ¿Qué hace esta consulta LINQ?
- 29. ayuda a entender macro
- 30. ¿Qué hay de malo con esta macro de definición de sintaxis en el esquema?
QT se refiere a QuickTime y Qt se refiere a la biblioteca de C++ llamada Qt. – Bleadof