2009-12-20 22 views
20

Para la señal y la ranura de tipo continuaciónTipo de argumento para la señal Qt y la ranura, ¿importa la referencia de los calificadores?

signals: 
    void textChanged(const QString &); 

public slots: 
    void setText(const QString & text) 

el tipo de argumento de TextChanged y setText parece funcionar invarable de const y &. ¿La diferencia constante y la calificación de referencia hacen alguna diferencia en comparación con solo usar QString?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString))); 
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &))); 

EDIT: que no vi la ventana de salida que muestra mensajes de error cuando hay tipo incompatible siendo utilizado en la señal o ranura. Pensé que el mecanismo de ranura de señal es capaz de detectar el error de tipo de argumento en tiempo de compilación.

Respuesta

24

Qt comprueba una normalized signature, lo que significa

normalización reduce el espacio en blanco a un mínimo , mueve 'const' a la parte delantera en su caso, elimina 'const' de los tipos de valor y sustituye const referencias con valores .

+0

¿Hay algún artículo que explique completamente cómo Qt implementa el mecanismo de señal y ranura? que no sea http://doc.trolltech.com/4.6/signalsandslots.html – yesraaj

+0

¿Quiere decir completamente como en mayor detalle, o completamente como un tutorial que lo guía a través de él, pero a otro ritmo? – e8johan

+0

con más detalles, se agradece cualquier enlace :) – yesraaj

3

Descargo de responsabilidad: Mi qt es bastante oxidado, pero el mecanismo de señal/ranura sigue siendo solo llamadas de función C++. Si el mecanismo de señal/ranura realmente copia los objetos en el almacenamiento interno, mis disculpas (necesitarás revisar las páginas de Qt, hay una grande en afaik de señales/ranuras), ya que los bits a continuación solo serán relevantes en un contexto de C++. no en un contexto C++ + Qt.

Si omite la referencia, la cadena se copiará (y tener la const no importaría, cualquier cambio que se realice permanecerá en la función sola).
Si sale de la referencia pero saca la const, permite que el método modifique la cadena que le da. Ambos funcionan, pero hacen cosas diferentes al objeto que pasa (cantidad de copia/posibilidad de retener cambios).

le sugiero que lea los siguientes recursos:

(en la corrección const) https://isocpp.org/wiki/faq/const-correctness

(en referencias) https://isocpp.org/wiki/faq/references

para entender exactamente lo que pasa un parámetro es y cómo void foo(const A&)/ / void foo(A&)/ void foo(A) son todos diferentes.

+5

Para las conexiones directas, se recomienda que los valores se pasen por referencia para evitar copias innecesarias. Para conexiones en cola Qt hará una copia sin importar cómo pase los argumentos. – rpg

Cuestiones relacionadas