2011-12-24 8 views
7

Recientemente me encontré con un problema con mi código que fue causado por ciertos comportamientos que dependen del orden de conexión de la ranura de señal en un objeto particular. Este es un error de diseño en mi nombre (las conexiones siempre debían ser dinámicas, así que este error era inevitable), pero me hizo pensar.Cambiar la orden de conexión de la ranura de señal

¿Es posible reordenar las conexiones de ranura de señal en un objeto? y/o especifique el "índice" de una conexión al crear una?

Soy consciente de que se puede simular este efecto mediante la destrucción de todas las conexiones y volver a crearlos en un nuevo orden, pero eso no es lo que estoy pidiendo. No pude encontrar nada en la API o documentos generales, así que sospecho que la respuesta es no, pero pensé que debería preguntar de todos modos ...

Respuesta

10

Al contrario de lo que seemed to be the past understanding, me sorprende leer una actualización que (en menos en las versiones recientes) Qt no ha salido de la orden de ranura llamar como no definidos:

Si varias ranuras están conectados a una señal, las ranuras serán ejecutadas una después de la otra, en el orden en que se han conectado, cuando la señal es emitida

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(Aunque se podría argumentar que una frase en que un documento no es suficiente para representar una garantía "fuerte" para todas las versiones de Qt 4.X pasadas y futuras.)

No parece haber una API para reordenar las señales y las ranuras. Incluso si hubiera existido, me sentiría confiando en la orden no es una muy buena idea. Sugeriría repensar el diseño.

Una cosa que podría investigar sería hacerlo de modo que sus máquinas tragamonedas pusieran en cola sus acciones en lugar de tomar medidas directamente. Luego, cuando se hayan llamado a todas las ranuras, procesarás esa cola ... teniendo en cuenta algunos atributos de prioridad.

+0

De acuerdo. Como mencioné en mi pregunta, reconozco que es un defecto de diseño, pero los desarrolladores de API deben darnos todo lo que necesitamos para salir de las situaciones difíciles, ya sea con clase o no. Hubiera pensado que esto sería obvio, pero a juzgar por la falta de consultas en Internet, ¡me parece que estoy equivocado! – cmannett85

+0

Así como hay dos tipos de libertades políticas ("libertad para" y "libertad de"), hay dos tipos de poder en el diseño de API. En este caso, creo que está bien no ofrecer la capacidad de reordenar las señales, simplemente parece incongruente con la afirmación de que hay un orden contractual. * shrug * http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork

0

QObject almacena internamente las conexiones como una lista. Es simple utilizar el encabezado <private/qobject_p.h> para adquirir un bloqueo en la lista de conexiones del remitente y reordenar sus entradas. Una API pública haría que este detalle se fijara durante la duración de cada revisión de Qt principal, y esto se consideró demasiado restrictivo.

Cuestiones relacionadas