Argumenttyp für Qt-Signal und Slot, sind konstante Referenzqualifikatoren wichtig?
Zur signal-und-slot von unten Typ
signals:
void textChanged(const QString &);
public slots:
void setText(const QString & text)
den Typ des Arguments von textChanged-und setText scheint zu funktionieren invarable von const und &. Hat die ständige und Berufsabschluss keinen Unterschied machen, im Vergleich zu nur mit QString ?
QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString)));
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));
BEARBEITEN:
Ich habe nicht bemerkt die Ausgabe-Fenster zeigt Fehlermeldungen, wenn es unvereinbare Art verwendet werden in der SIGNAL-oder SLOT. Ich dachte, das signal-slot-Mechanismus ist in der Lage, argument-Typ-Fehler zur compile-Zeit.
InformationsquelleAutor der Frage yesraaj | 2009-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Qt prüft eine normalisierte SignaturBedeutung
InformationsquelleAutor der Antwort e8johan
Disclaimer: Mein qt ist ziemlich rostig, aber das signal/slot-Mechanismus ist nur noch C++ - Funktion aufruft. Wenn das signal/slot-Mechanismus eigentlich Kopien von Objekten in interner Speicher, meine Entschuldigung (Sie müssen überprüfen Sie den Qt-Seiten, es ist ein großes auf Signale/slots afaik) - wie die bits unten wird nur relevant sein, die in einem C++ - Kontext, nicht in einem C++ + Qt-Kontext.
Lassen Sie sich die Referenz der string kopiert werden soll (und dass die const-egal waere, etwaige änderungen bleiben in der Funktion allein).
Wenn Sie lassen Sie in der Referenz, aber nehmen Sie die const, können Sie die Methode zum ändern der Zeichenfolge, die Sie ihm geben. Sie funktionieren beide, aber verschiedene Dinge tun, um das Objekt, das Sie übergeben (Anzahl von kopieren/Möglichkeit der Beibehaltung der änderungen).
Ich schlage vor, Sie Lesen Sie die folgenden Ressourcen:
(auf const-correctness) https://isocpp.org/wiki/faq/const-correctness
(Referenzen) https://isocpp.org/wiki/faq/references
zu verstehen, was genau ein parameter übergeben wird und wie
void foo(const A&)
/void foo(const A)
/void foo(A&)
/void foo(A)
sind alle Verschieden.
InformationsquelleAutor der Antwort laura