Обычный способ, например видел в kdelibs, это:
Q_SIGNALS:
#ifndef Q_MOC_RUN
private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif
void somePrivateSignal();
Это делает сигнал частным, т. Е. Он может излучаться только самим классом, но не его подклассами. Чтобы не делать «private:» отменяющим Q_SIGNALS (moc не будет видеть somePrivateSignal как сигнал), он находится внутри Q_MOC_RUN, который определяется только при запуске moc.
Редактировать: Этот подход не работает для соединений нового стиля, представленных в Qt 5 (connect(a, &A::someSignal, b, &B::someSlot)
), так как они требуют, чтобы сигнал был доступен.