O que faz a macro Q_OBJECT? Por que todos os objects do Qt precisam dessa macro?

Acabei de começar a usar o Qt e notei que todas as definições de class de exemplo têm a macro Q_OBJECT como a primeira linha. Qual é o objective dessa macro de pré-processador?

Da documentação do Qt :

O Meta-Object Compiler, moc, é o programa que manipula as extensões C ++ do Qt.

A ferramenta moc lê um arquivo de header C ++. Se ele encontrar uma ou mais declarações de class que contenham a macro Q_OBJECT, ele produzirá um arquivo de origem C ++ contendo o código meta-object para essas classs. Entre outras coisas, o código meta-object é necessário para o mecanismo de sinais e slots, as informações de tipo de tempo de execução e o sistema de propriedades dinâmicas.

Ele simplesmente diz ao pré-compilador que esta class tem elementos gui e precisa ser executada através do ‘moc’ que você só precisa adicionar a classs que usam o mecanismo de sinal / slot.
Mas ele será silenciosamente ignorado em outras classs – apenas aumenta o tempo de construção.

O MOC (meta object compilador) converte os arquivos de header incluídos na macro Q_OBJECT em código-fonte equivalente C ++. Ele basicamente controla o mecanismo de slot de sinal e o torna compreensível para o compilador C ++

A macro Q_OBJECT deve aparecer na seção privada de uma definição de class que declara seus próprios sinais e slots ou que usa outros serviços fornecidos pelo sistema de meta-objects da Qt.

1 Da documentação do Qt do The Meta-Object System

A ferramenta moc lê um arquivo de origem C ++. Se ele encontrar uma ou mais declarações de class que contenham a macro Q_OBJECT, ele produz outro arquivo de origem C ++ que contém o código meta-object para cada uma dessas classs. Esse arquivo de origem gerado é # incluído no arquivo de origem da class ou, mais comumente, compilado e vinculado à implementação da class.

2 Da documentação do Qt do Q_OBJECT

A macro Q_OBJECT deve aparecer na seção privada de uma definição de class que declara seus próprios sinais e slots ou que usa outros serviços fornecidos pelo sistema de meta-objects da Qt.

3 Da documentação do Qt do moc

A ferramenta moc lê um arquivo de header C ++. Se ele encontrar uma ou mais declarações de class que contenham a macro Q_OBJECT, ele produzirá um arquivo de origem C ++ contendo o código meta-object para essas classs. Entre outras coisas, o código meta-object é necessário para o mecanismo de sinais e slots, as informações de tipo de tempo de execução e o sistema de propriedades dinâmicas.

4 Da documentação do Qt de Sinais e Slots

A macro Q_OBJECT é expandida pelo pré-processador para declarar várias funções de membro que são implementadas pelo moc; se você obtiver erros do compilador ao longo das linhas de “referência indefinida para vtable para LcdNumber”, você provavelmente esqueceu de executar o moc ou include a saída moc no comando link.