tutorial signal custom and qt signals

signal - señales qt privadas/públicas



qt signals and slots tutorial (5)

¿Las señales de Qt pueden ser públicas o privadas? ¿Puedo crear señales internas, que solo se ven dentro de la clase?

Actualización: tengo una clase con algunas señales internas. ¿Cómo puedo hacer que esas señales sean invisibles para otras clases (encapsulación y ocultamiento de información)?


Las máquinas tragamonedas son métodos simples que pueden ser públicos, protegidos o privados.

Como lo señaló Andrei, la señal es solo una redefinición de protegida, lo que significa que solo pueden ser emitidos por la clase en la que están definidos.

Si desea hacer que una clase emita una señal desde otro, debe agregarle un método público (o ranura) como este:

void emitTheSignal(...) { emit theSignal(...); }


Las señales Qt son públicas en el sentido de que cualquier objeto puede conectarse a cualquier señal.



No. Las señales no pueden ser públicas o privadas. Las señales de Qt son métodos de clase protegidos.

La palabra clave "señales" se define en qobjectdefs.h (línea 69 en cuanto a Qt 4.6.1):

# define signals protected

ACTUALIZACIÓN: las señales solo están protected e incluyen todas las versiones menores de Qt 4. Desde Qt 5.0 en adelante son public . Ver https://.com/a/19130831 .


Una forma común, por ejemplo, vista en kdelibs, es esta:

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 sea privada, es decir, solo 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 connect(a, &A::someSignal, b, &B::someSlot) nuevo estilo introducidos con Qt 5 ( connect(a, &A::someSignal, b, &B::someSlot) ), ya que requieren que la señal sea accesible.