2009-09-02 17 views

Respuesta

110

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 .

14

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.

+0

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

+0

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'. –

7

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

+0

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 **. –

1

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.

+0

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

+0

@KubaOber ¿tiene un ejemplo de código que se compila pero no funciona cuando falta la macro 'Q_OBJECT'? – Chris

Cuestiones relacionadas