2012-08-09 24 views
8

Qt documentation dice, valori di ritorno dei segnali non sono possibili:Qt: Il valore di ritorno del segnale funziona, perché il documento ufficiale dice che è impossibile/vietato?

segnali sono generati automaticamente dal moc e non devono essere implementate nel file cpp. Non possono mai avere tipi di reso (ad esempio use void).

correlati SO domande:

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

Tuttavia, dai miei studi (Qt 4.8.1) posso dire valori di ritorno do lavoro:

  1. Se il segnale/slot sono nello stesso thr ead, ConnectionType può essere Qt::AutoConnection
  2. Con segnale/slot diversi thread ho bisogno di usare Qt::BlockingQueuedConnection

Quindi, nel mio codice che io chiamo un segnale da

QString dp = emit WscAircrafts::signalAircraftsJsonArray(); 

e la moc segnale restituisce un QString ,

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

Questa ecco la moc fessura dove passa indietro il QString

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

Tutto ciò sembra essere abbastanza semplice, quindi perché questa contraddizione con la documentazione? Dove dovrebbe essere il problema usando il valore di ritorno? Come detto, nel mio codice sembra funzionare.

+3

cosa succede se il segnale è collegato a più slot? –

+2

In un'altra domanda simile la risposta dice: "Sembra possibile, sono stato in grado di emettere un segnale e ricevere un valore dallo slot a cui era collegato il segnale, ma il problema era che restituiva solo l'ultimo valore di ritorno dal più slot connessi ". Deve essere la ragione per cui non vogliono pubblicizzare questa funzione –

+0

@RomanSaveljev - dovrebbe anche bloccare fino a quando lo slot non è stato completato? –

risposta

5

Il problema è che i tipi di ritorno non sono controllati per la compatibilità al momento della connessione, quindi collegando uno slot con doppia uscita ad un segnale di ritorno float, ad esempio, verrà sovraccaricato lo spazio stack (no pun intended) assegnato il galleggiante.

+0

Ma questo significherebbe anche, se i tipi di ritorno si adattano e tutto è fatto correttamente, non sarà un problema usarli. –

+1

@HorstWalter yes, a meno che la connessione non sia accodata (nel qual caso il richiamo dello slot differito potrebbe sovraccaricare la memoria liberata da molto tempo, ma non l'ho controllato profondamente) o c'è più di uno slot collegato al segnale (nel qual caso si ' d ottiene solo il risultato dell'ultimo slot). –