versiones guia español descargar actualizar c++ qt signals-slots const-reference pass-by-const-reference

c++ - guia - const-ref cuando se envían señales en Qt



qgis manual (3)

Aquí hay una buena demostración que muestra cómo las señales / ranuras Qt administran la copia: http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/

Esto es algo que nunca conseguí con const-ref y realmente espero que alguien me lo explique.

Cuando invoco una función dentro de otra función, entiendo que const-ref es la mejor manera al pasar objetos de pila que no planeo manipular. Por ejemplo:

void someInnerFunction(const QString& text) { qDebug() << text; } void someFunction() { QString test = "lala"; .... someInnerFunction(test); }

Hasta ahora todo bien, supongo. Pero, ¿y las señales? ¿No hay ningún riesgo que conlleva pasar una referencia? A pesar de que es const . Parece que he estado leyendo todos los documentos sobre const-ref, pero todavía encuentro un poco arriesgado ya que lo entiendo como "enviar una referencia a un objeto y mantenerlo const ". ¿Qué sucede si el objeto al que se refiere está fuera del alcance?

Por ejemplo:

void someFunction() { connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&))); QString test = "lala"; emit someSignal(test); // doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied. } void someSlot(const QString& test) { qDebug() << test; // will this work? }

¿Qué está pasando realmente aquí? Frecuentemente uso const-ref en llamadas a funciones donde solo quiero acceder al objeto pero no cambiarlo. Pero, ¿y las señales? La mayoría de las señales parecen tener const-ref parm en el Qt doc, pero ¿cómo funciona?


De acuerdo con esta respuesta , Qt simplemente reemplaza las referencias de const con copias.

EDITAR: Aparentemente no siempre es el caso ... Acabo de hacer un programa de prueba básico con un hilo, y la referencia se pasó correctamente. Su constidad permaneció intacta, también. De todos modos, sí, debes ser cauteloso con la variable que se sale del alcance, además de que no puedes enviar referencias a través de los hilos de esta manera. Si lo hace, solo se pasarán las copias.

Para responder las preguntas en los comentarios de su ejemplo, sí, funcionará independientemente de si se trata de una conexión directa o en cola. Si se trata de una conexión directa, funcionará porque someSlot() se ejecutará antes de que someFunction() ; si es una conexión en cola, funcionará porque la test se copiará en lugar de pasar por referencia.


En Qt, cuando se emite una señal que está conectada a una ranura o ranuras, equivale a una llamada de función síncrona ... a menos que haya configurado sus señales y ranuras para usar las conexiones en cola, entonces es una llamada asíncrona y debe estar cuidado al pasar datos de la pila y debe pasar una copia como si pasara datos a otra secuencia.