2010-09-20 31 views
14

¿Hay alguna manera de ver qué señales se disparan y si hay una ranura conectada a ellas? Idealmente, nos gustaría ver todas las señales, no solo las de una clase o método en particular; p.ej. QSignalSpy solo nos permite rastrear señales específicas de instancias específicas.Debug Qt señales, ranuras y conexiones

En nuestra aplicación, hemos visto problemas de rendimiento debido a una señal emitida dos veces por diferentes componentes. Al final, resultó que había una segunda instancia de una clase que debería haber estado allí solo una vez. Saber qué señales se emiten exactamente ayuda a depurar esto.

Las señales se llaman a través de QMetaObject::invoke*, esperaba encontrar algo allí para conectar, pero no encontré nada obvio.

+0

posible duplicado de [¿Cómo interceptar TODAS las señales emitidas por un evento determinado en QT?] (Http://stackoverflow.com/questions/2072013/how-to-intercept-all-signals-emitted-by-a- given-event-in-qt) – exilit

+0

Si desea tener solo una instancia de la clase, ¿por qué no usó el patrón singleton para controlar el número de objetos? – Afshin

Respuesta

1

QSignalSpy podría ayudarlo.

a partir de documentos,

La clase QSignalSpy permite la introspección de la señal emission.QSignalSpy se puede conectar a cualquier señal de cualquier objeto y registra su emisión.

Los ejemplos Docs tiene también ..

+1

Soy consciente de la señal de espionaje, lo siento por no mencionar eso. La desventaja de esto es que no me permite ver * todas * las señales emitidas, solo señales específicas de una sola clase o instancia. – Ivo

+0

@ Ivo, no estoy seguro de si hay algo que enumere todas las señales emitidas, pero sí 'QSignalMapper' es para rastrear las señales de la instancia especificada .. – liaK

+0

Qt mantiene una lista de señales internamente, que es una estructura que contiene al menos la cadena que contiene el nombre y la firma de la señal. Todo lo que pude deducir al mirar el código. Sin embargo, desafortunadamente, esto está enterrado muy profundo en Qt. – Ivo

5

(descargo de responsabilidad, trabajo para KDAB): KDAB de GammaRay tool le puede mostrar objetos y conexiones en tiempo de ejecución, sin necesidad de cambios de código. Inspecciona las tablas de metaobjetos y realiza algunos ganchos de inyección de código para que esto funcione.

+1

Creé GammaRay desde el repositorio git y no pude encontrar dónde se muestran las conexiones (construido con Qt 5.7); el panel Señales solo mostró tics de emisión. Lo mejor que podía hacer como alternativa era eliminar la comprobación de QT_DEBUG en qobject.cpp y llamar a dumpObjectInfo() para ver todas las conexiones de señal/ranura del objeto; de lo contrario, no se imprimía nada para mi configuración de Qt -debug-and-release . –

Cuestiones relacionadas