Una forma común, por ejemplo, visto en kdelibs, es la siguiente:
Q_SIGNALS:
#ifndef Q_MOC_RUN
private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif
void somePrivateSignal();
Esto hace que la señal privada, es decir, que sólo puede ser emitida por la propia clase, pero no por sus subclases. Para no hacer que el "privado" anule Q_SIGNALS (moc no vería alguna señal privada como señal), está dentro de Q_MOC_RUN, que solo se define cuando se ejecuta moc.
Editar: Este enfoque no funciona para los nuevos conectores de estilo introducidos con Qt 5 (connect(a, &A::someSignal, b, &B::someSlot)
), ya que requieren que la señal sea accesible.
también son públicos en el sentido de que cualquier otra clase puede emitirlos, ya que son funciones públicas. esto puede haber cambiado desde las versiones anteriores de Qt. mira aquí http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 – johnbakers