2009-12-20 9 views
20

Für Signal- und Schlitz von unten TypArgumenttyp für Qt-Signal und Slot, sind konstante Referenzqualifikatoren wichtig?

signals: 
    void textChanged(const QString &); 

public slots: 
    void setText(const QString & text) 

die Art der Argumentation von Textchanged und setText scheint invarable von konst und & zu arbeiten. Macht die Konstanten- und Referenzqualifikation einen Unterschied gegenüber der Verwendung von QString?

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

EDIT: ich nicht das Ausgabefenster zeigt Fehlermeldungen bemerkt haben, wenn es nicht kompatiblen Typ ist in SIGNAL oder SLOT verwendet wird. Ich dachte, der Signal-Slot-Mechanismus ist in der Lage, den Fehler des Argumenttyps zur Kompilierzeit zu erkennen.

Antwort

24

Qt prüft eine normalized signature, was bedeutet,

Normalisierungs Leerzeichen zu einem Minimum reduziert, bewegt ‚const‘ nach vorne gegebenenfalls ‚const‘ von Werttypen entfernt und ersetzt const Referenzen mit Werten .

+0

Gibt es einen Artikel, der ausführlich erklärt, wie Qt Signal-und Slot-Mechanismus implementiert? anders als http://doc.trolltech.com/4.6/signalsandslots.html – yesraaj

+0

Meinst du vollständig als ausführlicher, oder vollständig als ein Tutorial, das dich durch es geht, aber in einem anderen Tempo? – e8johan

+0

mit größeren Details, jeder Link wird geschätzt :) – yesraaj

3

Haftungsausschluss: Mein Qt ist ziemlich rostig, aber der Signal/Slot-Mechanismus ist immer noch nur C++ Funktionsaufrufe. Wenn der Signal/Slot-Mechanismus tatsächlich Objekte in den internen Speicher kopiert, entschuldige ich mich (Sie müssen die Qt-Seiten überprüfen, da ist ein großes Signal/slots afaik) - da die folgenden Bits nur in einem C++ Kontext relevant sind, nicht in einem C++ + Qt-Kontext.

Wenn Sie die Referenz weglassen, wird die Zeichenfolge kopiert (und die const wäre unwichtig, alle daran vorgenommenen Änderungen bleiben nur in der Funktion erhalten).
Wenn Sie in der Referenz bleiben, aber die Konstante entfernen, erlauben Sie der Methode, die Zeichenfolge zu ändern, die Sie ihm geben. Sie arbeiten beide, aber machen unterschiedliche Dinge zum Objekt, das du passierst (Menge des Kopierens/Möglichkeit, Änderungen zu behalten).

Ich schlage vor, Sie in den folgenden Ressourcen lesen:

(auf const Korrektheit) https://isocpp.org/wiki/faq/const-correctness

(auf Referenzen) https://isocpp.org/wiki/faq/references

genau zu verstehen, was einen Parameter übergeben ist und wie void foo(const A&)/ / void foo(A&)/ void foo(A) sind alle unterschiedlich.

+5

Für direkte Verbindungen wird empfohlen, dass die Werte von const referenz übergeben werden, um unnötige Kopien zu vermeiden. Für Warteschlangenverbindungen erstellt Qt eine Kopie, egal wie Sie die Argumente übergeben. – rpg

Verwandte Themen