Indietro nei vecchi tempi, non avevi altra scelta che usare gli slot se vuoi connetterti ai segnali. Questo non è più il caso in Qt 5, dove le connessioni possono essere fatte a funzioni membro regolari o anche funzioni libere o lambda.
Dichiarare uno slot registra quella funzione nei metadati di quel particolare oggetto, rendendola prontamente disponibile a tutte le funzionalità di Qt che si basano sul meta oggetto. Oltre a questo, è una funzione membro normale come afferma la documentazione. Non c'è nulla di speciale nella stessa funzione di slot, la differenza è nella generazione di metadati per esso nel meta oggetto.
Ciò significa che dichiarare gli slot ha un costo, anche se piccolo, sia in termini di compilazione che di dimensioni eseguibili. Direi che è eccessivo avere tutte le tue funzioni pubbliche come slot. Sarebbe più efficiente usare solo gli slot quando effettivamente hai bisogno di slot, se non può funzionare con una funzione regolare, rendilo uno slot.
Inoltre, si noti che in quasi tutti i casi, i segnali vengono dichiarati con un tipo di ritorno void
. Questo ha a che fare con il tipico caso d'uso dei segnali: spesso possono passare un parametro, ma raramente restituiscono qualcosa. Anche se è possibile restituire un valore attraverso un segnale collegato a uno slot, questo viene usato molto raramente. Quindi non ha molto senso dichiarare una funzione che restituisce qualcosa come uno slot a cui si intende connettersi, poiché il fatto stesso che restituisce un valore significa che molto probabilmente non verrà utilizzato nel tipico contesto di segnale/slot. Ecco perché il getter non è uno slot in questo esempio. Il setter come slot è ridondante in Qt 5 ed è probabilmente il prodotto di questo codice di esempio risalente a Qt 4.
Infine, separare gli slot dalle normali funzioni pubbliche è un buon modo per illustrare l'intento, o l'API "di quella classe se lo farai.Ad esempio, utilizzo principalmente gli slot per l'estensione di QML, quindi non è necessario contrassegnare esplicitamente tutte le funzioni come invocabili: a differenza dello scenario menzionato nel paragrafo precedente, tali slot spesso restituiscono elementi, ma non sono realmente utilizzati nelle connessioni. In questo modo ottengo una chiara panoramica del design dell'interfaccia fornita dalla classe.
Questa risposta non ha il minimo significato, e non sembra nemmeno affrontare la domanda. – MrEricSir
È possibile utilizzare i valori di ritorno negli slot? O addirittura ottenere il valore di un parametro di riferimento nel modo corretto? – SuperFliege
@SuperFliege - lo slot è solo una funzione, funzionerebbe esattamente allo stesso modo di una funzione. Il multithreading e la durata dell'oggetto sono una questione completamente diversa e influiscono sulle funzioni regolari tanto quanto influiscono sugli slot. – dtech