2010-01-26 17 views
26

¿pueden las señales qt ser públicas o privadas?privada/pública qt señales

¿Puedo crear señales internas, que solo se ven dentro de la clase?

añadido: Tengo una clase con algunas señales internas. ¿Cómo puedo hacer que esas señales invisible para otras clases (encapsulación & ocultación de la información)

Gracias de antemano, Anton

Respuesta

4

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

+0

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

19

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

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

# define signals protected 

UPDATE: solamente señales protected hasta e incluyendo todas las versiones menores de Qt 4 son. Desde Qt 5.0 en adelante son public. Ver https://stackoverflow.com/a/19130831.

+2

Creo que las señales ahora se consideran 'públicas', mira aquí http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567 # 19130567 – johnbakers

+0

Parece que puede haber señales privadas: http://doc.qt.io/qt-5/qstate.html#finished: ¿cómo se crean? – derM

12

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

Como 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 una clase emite una señal de anoter uno, hay que añadir que un método público (o ranura) como éste:

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

Creo que esto no responde a la pregunta OP. Se refiere a señales que solo pueden ser escuchadas por la clase que las ha definido. – Daniel

+0

"solo pueden ser emitidos por la clase en la que están definidos" ... O una clase de amigo. ;) – weberc2

+0

No estoy seguro de que esto sea cierto. Vea aquí: http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions Las señales de cacs de documentos pueden emitirse desde otras clases, y son siempre públicas, no protegidas. – johnbakers

15

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.

+0

¿'privado: Q_SIGNAL mySignal();' también funciona? – leemes

+0

No, como "#define Q_SIGNALS protected", lo privado: no tendrá ningún efecto –

+0

Drat. ¿Por qué todo en C++ requiere un truco? – weberc2

Cuestiones relacionadas