custom - qt signals and slots tutorial
Determine las seƱales conectadas a una ranura dada en Qt (3)
Creo que Qt almacena las ranuras a las que está conectada una señal determinada, de modo que cuando la emites se llaman todos los receptores, por lo tanto puedes acceder a la lista de receptores:
Para fines de depuración, tiene:
void QObject :: dumpObjectInfo ()
Vuelca información sobre las conexiones de señal, etc. para este objeto a la salida de depuración.
Esta función es útil para la depuración, pero no hace nada si la biblioteca se ha compilado en modo de lanzamiento (es decir, sin información de depuración).
Y la lista de ranuras de una señal está conectada:
int QObject :: receptores (const char * signal) const [protected]
Devuelve la cantidad 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 repasar todas las señales (utilizando el objeto meta, probando el tipo de método para la señal) y construir un índice inverso con los receptores de ranuras () que le brinda.
Me inyecté 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 hacer esto. ¿Hay un mecanismo para hacer esto de la caja? Si es así, ¿está esto expuesto a QtScript? (Si no, puedo envolverlo con la suficiente facilidad)
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.
Después de buscar en la base de código Qt y en la documentación (obtuve 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.
No hay forma de iterar de forma segura 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 hagas en QObject::connect
es en sí mismo insuficiente. Los datos que obtenga de dichos enlaces sufrirán lo siguiente:
Puede que tenga punteros a objetos que ya están borrados cuando intenta acceder a ellos. Puede mitigar esto utilizando
QPointer
, pero esto solo funciona para los objetos que viven en el hilo donde ejecuta su código. Tendría que inyectar su objeto en otros hilos para recoger listas de objetos allí.Puede tener conexiones que ya no existen. Incluso conectar
QObject::disconnect
sería insuficiente, ya que las conexiones se eliminan cuando los objetos dejan de existir.
El problema al que se enfrenta es bastante complejo, y cualquier solución robusta no se limitaría simplemente a "conectar" QObject::connect
.
Por desgracia, no has dicho por qué necesitas la lista de señales que se conectan a una ranura. ¿Cuál es el propósito de esto?