2009-12-20 6 views
20

Per segnale e lo slot di tipo sottoTipo di argomento per segnale Qt e slot, i qualificatori di riferimento const sono importanti?

signals: 
    void textChanged(const QString &); 

public slots: 
    void setText(const QString & text) 

il tipo di argomento di TextChanged e setText sembra funzionare invarable di const e &. La qualifica costante e di riferimento fa alcuna differenza rispetto all'utilizzo di QString?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString))); 
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &))); 

EDIT: non ho notato la finestra di output che mostra messaggi di errore quando non v'è incompatibilità tipo in uso in segnale o SLOT. Ho pensato che il meccanismo dello slot del segnale sia in grado di rilevare l'errore del tipo di argomento in fase di compilazione.

risposta

24

Qt controlla un normalized signature, che significa

normalizzazione riduce gli spazi al minimo , mosse 'const' al fronte se del caso, rimuove 'const' da tipi di valore e sostituisce const riferimenti con valori .

+0

C'è qualche articolo che spiega completamente come Qt implementa il meccanismo di segnale e slot? diverso da http://doc.trolltech.com/4.6/signalsandslots.html – yesraaj

+0

Intendi completamente come nei dettagli, o completamente come un tutorial che ti guida attraverso, ma a un altro ritmo? – e8johan

+0

con maggiori dettagli, qualsiasi collegamento è apprezzato :) – yesraaj

3

Disclaimer: Il mio qt è piuttosto arrugginito, ma il meccanismo segnale/slot è ancora solo chiamate di funzione C++. Se il meccanismo segnale/slot copia effettivamente gli oggetti nella memoria interna, mi scuso (dovrete controllare le pagine Qt, ce n'è una grande su segnali/slot afaik) - poiché i bit sottostanti saranno rilevanti solo in un contesto C++, non in un contesto C++ + Qt.

Se si omette il riferimento, la stringa verrà copiata (e non avendo importanza il const, le eventuali modifiche apportate rimarranno nella sola funzione).
Se si lascia nel riferimento ma si estrae il const, si consente al metodo di modificare la stringa assegnata. Entrambi funzionano, ma fanno cose diverse per l'oggetto che si passa (quantità di copia/possibilità di modifiche di conservazione).

vi consiglio di leggere le seguenti risorse:

(su const correttezza) https://isocpp.org/wiki/faq/const-correctness

(su referenze) https://isocpp.org/wiki/faq/references

per capire esattamente che cosa passando un parametro e come void foo(const A&)/ / void foo(A&)/ void foo(A) sono tutti diversi.

+5

Per le connessioni dirette, è consigliabile che i valori vengano passati per riferimento const per evitare copie inutili. Per le connessioni in coda Qt eseguirà una copia indipendentemente dal modo in cui si passano gli argomenti. – rpg