Boost.Signals consente various strategies di utilizzare i valori di ritorno degli slot per formare il valore di ritorno del segnale. Per esempio. aggiungendoli, formando uno vector
di questi o restituendo l'ultimo.I segnali Qt possono restituire un valore?
La saggezza comune (espressa nella documentazione Qt [EDIT: così come alcune risposte a questa domanda ]) è che nulla del genere è possibile con i segnali Qt.
Tuttavia, quando ho eseguito il MOC sulla seguente definizione di classe:
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();
};
Non solo non Moc lamentarsi del segnale con il tipo di ritorno non-vuoto, sembra ad attuare attivamente in tale un modo tale da consentire un valore di ritorno di passare:
// 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;
}
Quindi: secondo la documentazione, questa cosa non è possibile. Allora cosa sta facendo moc qui?
Slots can have return values, così possiamo collegare uno slot con un valore di ritorno a un segnale con un valore di ritorno ora? Potrebbe essere possibile, dopotutto? Se è così, è utile?
MODIFICA: Non sto chiedendo soluzioni alternative, quindi non fornire nulla.
EDIT: Ovviamente non è utile in modalità Qt::QueuedConnection
(né è la QPrintPreviewWidget API, però, e ancora esiste ed è utile). Ma che dire di Qt::DirectConnection
e Qt::BlockingQueuedConnection
(o Qt::AutoConnection
, quando si risolve in Qt::DirectConnection
).
grazie per aver effettivamente provato :) Ho modificato il tuo codice per essere più semplice e più breve. Tuttavia, la domanda è ancora valida: se funziona (con la semantica chiamata "last-called"), perché i documenti dicono che non funziona? –
Una bella domanda. Direi che i documenti dicono che non funziona perché è solo un valore di ritorno parziale. Il vero valore di ritorno di un'emissione di segnale * dovrebbe * essere un aggregato di tutti i risultati basati su un qualche tipo di aggregatore (come in boost). Ma, senza di ciò, è un risultato parziale e indefinito (specialmente nel contesto di una chiamata di segnale concorrente). Forse ci sono anche alcune differenze nel compilatore? – jsherer
Un comportamento non documentato significa che non si garantisce che funzioni ancora, ad esempio, Qt 5.0 :) – Torp