c++ qt introspection moc

c++ - ¿Por qué es importante incluir el archivo ".moc" al final de un archivo de código fuente Qt?



introspection (1)

Es necesario si define las subclases de QObject con la macro Q_OBJECT en un archivo .cpp . Cuando lo hagas:

  1. qmake debe generar reglas dentro de su Makefile para invocar moc en ese archivo .cpp .

    Esa inclusión especial (¿hackish?) Activa qmake para hacerlo, y le dice cuál sería el archivo de salida de teststring.moc ( teststring.moc ) cuando se invoca en su .cpp .

  2. Para compilar la salida de moc (que todavía es un montón de código C ++) el compilador debe ver su definición de clase. De lo contrario, se quejará de que no existe YourClass::staticMetaObject y similares, porque no tiene idea de que YourClass existe.

    Por lo general, uno define clases con Q_OBJECT en un archivo de encabezado. moc luego agrega un #include "header.h" en su salida generada, y esto significa que la salida de #include "header.h" puede compilarse felizmente.

    Pero, ¿qué pasa si la definición de su clase está dentro de un .cpp ? No puede .cpp un archivo .cpp en la salida de .cpp , ya que eso le daría toneladas de errores de redefinición.

    En cambio, .cpp salida de .cpp en su .cpp , para que se compile y todos .cpp contentos. (Esto significa que qmake solo emitirá una regla que dice que ejecute moc , pero no otra regla que le indique al compilador que compile la salida de moc ).

Desde 2. también puede suponer que definir clases con Q_OBJECT en un .h no requiere ninguna inclusión especial.

¿Por qué es importante agregar una inclusión para el archivo .moc en un código fuente Qt cpp?

Este es un paso común utilizado en varias muestras de Qt, incluido este: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html ; donde la línea #include "testqstring.moc" debe incluirse al final del archivo.

No entiendo exactamente por qué esto es necesario.

Gracias.