2010-05-03 12 views
24

Me he inyectado yo mismo en una aplicación Qt, y estoy tratando de descubrir a qué señales está conectada una ranura determinada, pero no puedo encontrar ninguna información sobre cómo hacerlo. ¿Hay un mecanismo para hacer esto de la caja? Si es así, ¿está esto expuesto a QtScript? (Si no, puedo envolverlo con facilidad.)Determine las señales conectadas a una ranura dada en Qt

Si no existe tal mecanismo, ¿cuál sería la mejor manera de agregarlo? No puedo manipular la aplicación existente fuera del simple enganche, pero podría enganchar QObject :: connect y almacenar las conexiones yo mismo, simplemente no estoy seguro de si esa es la mejor manera de hacerlo.

Respuesta

3

Después de buscar en la base de código Qt y en la documentación (recibí muchos consejos útiles de aquí y de otros lugares), terminé decidiendo conectar QObject :: connect (la sobrecarga estática). ¿Por qué? Bueno, las otras soluciones requieren que sepas qué objetos están proporcionando las señales, cavando en campos privados, o tienen que tener una versión de depuración de Qt. Al final, conectar QObject :: connect le proporciona todo lo conectado en la aplicación, y puede hacer un mapa trivial de las ranuras.

26

Creo Qt almacena las ranuras de una señal dada está conectada a, por lo que cuando emites que todos los receptores se llaman, por lo tanto, se puede acceder a la lista de receptores:

Para propósitos de depuración, tiene:

vacío QObject :: dumpObjectInfo()

volcados de información sobre la señal conexiones, etc., para este objeto para la salida de depuración.

Esta función es útil para la depuración, pero no hace nada si la biblioteca ha sido compilado en modo de lanzamiento (es decir sin información de depuración).

Y la lista de ranuras está conectado una señal:

int QObject :: receptores (const char * señal) const [protected]

Devuelve el número de receptores conectados a la señal.

El metaObjeto() le da el QMetaMethod para la ranura, pero no tiene información sobre sus conexiones.

Sin embargo, si conoce los objetos, puede revisar todas las señales (utilizando el metaobjeto, probando el tipo de método para la señal) y crear un índice inverso con los receptores de ranuras() que le ofrece.

+0

Gracias por la información. ¿Hay alguna posibilidad de hacer esto sin conocer los objetos? Ese es realmente el problema que me estoy encontrando en este momento. –

+6

La segunda parte de esta respuesta es bastante incorrecta. –

6

No hay manera de iterar con seguridad la lista de conexiones de ranura de señal sin mantener los mutex/semáforos internos de Qt. Las señales y las ranuras pueden aparecer y desaparecer en cualquier momento, de modo que, en el mejor de los casos, obtendría una lista que no se garantiza que sea correcta y, por lo tanto, inútil.

Cualquier enganche que haga en QObject::connect es insuficiente. Los datos que se obtiene de este tipo de ganchos sufrirá la siguiente:

  1. Usted puede tener punteros a objetos que ya están borrados por el tiempo que intenta acceder a ellos.Puede mitigar esto usando QPointer, pero esto solo funciona para objetos que viven en la secuencia donde ejecuta su código. Tendría que inyectar su objeto en otros hilos para recoger listas de objetos allí.

  2. Es posible que tenga conexiones que ya no existen. Incluso el enganche QObject::disconnect sería insuficiente, ya que las conexiones se eliminan cuando los objetos dejan de existir.

El problema que estamos enfrentando es bastante complejo, y cualquier solución robusta no sería meramente limitado a "enganchar" QObject::connect.

Por desgracia, no ha dicho por qué necesita la lista de señales que se conectan a una ranura. ¿Cuál es el propósito de esto?

Cuestiones relacionadas