2012-08-09 8 views
8

Qt documentation dice, valores de retorno de las señales no son posibles:Qt: El valor de retorno de la señal funciona, ¿por qué el documento oficial dice que es imposible/prohibido?

señales son generadas automáticamente por el MOC y no deben ser implementar en el archivo .cpp. Nunca pueden tener tipos de devolución (es decir, use void).

relacionados SO preguntas:

  1. Can Qt signals return a value?
  2. Qt: meaning of slot return value?

Sin embargo, a partir de mis ensayos (Qt 4.8.1) que puedo decir valores de retorno hacen el trabajo:

  1. Si la señal/ranura están en el mismo thr ead, ConnectionType puede ser Qt::AutoConnection
  2. Con relación señal/ranura en diferentes hilos que necesito para usar Qt::BlockingQueuedConnection

Así que en mi código que llamo una señal por

QString dp = emit WscAircrafts::signalAircraftsJsonArray(); 

y la moc señal vuelve un QString ,

QString _t0; 
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) }; 
QMetaObject::activate(this, &staticMetaObject, 0, _a); 
return _t0; 

Este aquí es el moc ranura donde pasa de nuevo el QString

case 4: { QString _r = _t->slotAircraftJsonArray(); 
    if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; 

Todo esto parece ser bastante directo, entonces ¿por qué esta contradicción con la documentación? ¿Dónde estaría el problema al usar el valor de retorno? Como dije, en mi código esto parece funcionar.

+3

¿Qué sucede si la señal está conectada a múltiples ranuras? –

+2

En otra pregunta similar, la respuesta dice: "Parece que esto es posible. Pude emitir una señal y recibir valor de la ranura a la que estaba conectada la señal. Pero el problema fue que solo devolvió el último valor de retorno del múltiples ranuras conectadas ". Debe ser la razón por la que no desean anunciar esta función –

+0

@RomanSaveljev. ¿También debería bloquear hasta que la ranura se haya completado? –

Respuesta

5

El problema es que no se comprueba la compatibilidad de los tipos de retorno en el tiempo de conexión, conectando una ranura de doble retorno a una señal de retorno flotante, por ejemplo, desbordará el espacio de la pila asignado el flotador

+0

Pero esto también significa que, si los tipos de devolución se ajustan y todo se hace correctamente, no será problema usarlos. –

+1

@ HorstWalter sí, a menos que la conexión esté en cola (en cuyo caso la invocación diferida de la ranura podría dañar la memoria de liberación prolongada, pero no he comprobado eso profundamente) o hay más de una ranura conectada a la señal (en cuyo caso ' solo obtengo el resultado del último tragamonedas). –

Cuestiones relacionadas