2012-06-11 14 views
14

Estoy usando una señal y una conexión de ranura en un bloque. Mi código de la siguiente maneraLa ranura se está llamando varias veces cada vez que se emite una señal

en a.cpp

{ 
QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
       this,SLOT(GetFlang1DimAftrAnalysis())); 

m_ptheFlange2Details->get();// one function inside which i am emiting 
          // GetFlang1DimAfterAnalysis() signal ; 

QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
        this,SLOT(GetFlang1DimAftrAnalysis())); 

} 

Dentro de la función get() cuando se ejecuta esta declaración emiten, la ranura se llama un montón de veces. Donde, según yo, debería llamar solo una vez.

+4

¿Te has asegurado de que 'connect' no se llame varias veces ?? !!! Por favor muéstranos un poco más de código. ¿En qué función 'connect' y' disconnect' se ha escrito? – Ammar

+2

¿Cuántas veces se llama a 'emit' en' get() '? – cmannett85

+2

Este código se ve bien. ¡Ahora publique la parte fea de su código! – ScarCode

Respuesta

26

Como se indica en algunos de los comentarios, esto generalmente se produce al llamar a la conexión más una vez. La ranura se llamará una vez por cada vez que se realice la conexión. Por ejemplo, el siguiente código dará como resultado que slot() se invoque 3 veces cuando signal() se emita una vez.

connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 

Si usted está haciendo conecta en el código que se puede ejecutar más de una vez, que es generalmente una buena idea utilizar Qt::UniqueConnection como el quinto parámetro. El siguiente código dará como resultado que se llame al slot() 1 vez cuando se emite signal() una vez.

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 

Estoy adivinando la razón por la que su código no funciona correctamente es porque se está omitiendo el quinto parámetro por defecto y se conecta a Qt::DirectConnection (para programas de un solo subproceso). Esto llama inmediatamente a la ranura como si fuera una llamada de función. Esto significa que es posible volver a llamar a la conexión antes de que ocurra la desconexión (si hay bucles en su programa).

+0

si está emitiendo una señal, entonces solo se está llamando a la ranura ¿verdad? no importa cuántas veces hayas usado la declaración de conexión ... podrías describir algo en Qt :: uniqueconnection ... ya que soy nuevo en qt, así que no tengo más idea sobre él ... – Kenta

+1

It * does * matter how muchas veces llama a connect * a menos que * use Qt :: UniqueConnection. Si está conectando en una función, y llama a esa función más de una vez, necesita usar Qt :: UniqueConnection o su ranura se llamará varias veces. Edité mi publicación para intentar mostrar eso un poco mejor. –

+0

@ Rick - Thankxxx – Kenta

Cuestiones relacionadas