Boost.Signals permite various strategies utilizar los valores de retorno de las ranuras para formar el valor de retorno de la señal. P.ej. agregándolos, formando un vector
de ellos, o devolviendo el último.¿Las señales de Qt pueden devolver un valor?
La sabiduría popular (expresada en la documentación de Qt [EDIT:, así como algunas respuestas a esta pregunta ]) es que tal cosa no es posible con señales de Qt.
Sin embargo, cuando ejecuto el moc en la siguiente definición de clase:
class Object : public QObject {
Q_OBJECT
public:
explicit Object(QObject * parent=0)
: QObject(parent) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
No sólo no MOC quejarse de la señal con el tipo de retorno no nula, parece implementar de forma activa en tales de manera que se permita que un valor de retorno de pasar:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
Por lo tanto: de acuerdo con los documentos, esto no es posible. Entonces, ¿qué está haciendo moc aquí?
Slots can have return values, entonces, ¿podemos conectar ahora una ranura con un valor de retorno a una señal con un valor de retorno? Que eso sea posible, después de todo? Si es así, ¿es útil?
EDIT: No estoy pidiendo soluciones, así que no proporcione ninguna.
EDIT: Es evidente que no es útil en el modo de Qt::QueuedConnection
(tampoco lo es el QPrintPreviewWidget API, sin embargo, y aún existe y es útil). Pero ¿qué pasa con Qt::DirectConnection
y Qt::BlockingQueuedConnection
(o Qt::AutoConnection
, cuando se resuelve en Qt::DirectConnection
).
gracias por intentarlo :) He editado tu código para que sea más simple y más corto. Sin embargo, la pregunta sigue en pie: si funciona (con la semántica llamada "last-called"), ¿por qué los documentos dicen que no? –
Una buena pregunta. Supongo que los documentos dicen que no funciona porque es solo un valor de retorno parcial. El verdadero valor de retorno de una emisión de señal * debería * ser un agregado de todos los resultados basados en algún tipo de agregador (como en el impulso). Pero, sin eso, es un resultado parcial e indefinido (especialmente en el contexto de una llamada de señal concurrente). Tal vez hay algunas diferencias de compilación también? – jsherer
Comportamiento no documentado significa que no está garantizado que todavía funcione en, digamos, Qt 5.0 :) – Torp