Die Verbindung überlastet Signale und slots in Qt-5
Ich bin mit Mühe in den Griff mit dem neuen signal/slot syntax (mit Zeiger auf member-Funktion) in Qt-5, beschrieben in Neue Signal-Slot-Syntax. Ich habe versucht, ändern diese:
QObject::connect(spinBox, SIGNAL(valueChanged(int)),
slider, SLOT(setValue(int));
:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
aber ich erhalte eine Fehlermeldung, wenn ich versuche zu kompilieren:
Fehler: keine passende Funktion für Aufruf von
QObject::connect(QSpinBox*&,
<unresolved overloaded function type>, QSlider*&, void
(QAbstractSlider::*)(int))
Habe ich versucht, mit clang und gcc auf Linux, sowohl mit -std=c++11
.
Was mache ich falsch, und wie kann ich es beheben?
Wenn deine syntax richtig ist, dann ist die einzige Erklärung könnte sein, dass Sie nicht die Verknüpfung, um die Qt5 Bibliotheken, aber z.B. Qt4 statt. Dies ist leicht zu überprüfen mit QtCreator auf der 'Projekte' - Seite.
Ich enthalten einige Unterklassen der QObject (QSpinBox etc.) damit hätte QObject. Ich habe versucht, hinzufügen, schließen auch wenn es noch nicht kompiliert.
Auch ich bin definitiv Verlinkung gegen Qt 5, ich bin mit Qt Creator und die beiden kits Teste ich mit beiden haben Qt 5.0.1 als Ihren Qt-version.
Ich enthalten einige Unterklassen der QObject (QSpinBox etc.) damit hätte QObject. Ich habe versucht, hinzufügen, schließen auch wenn es noch nicht kompiliert.
Auch ich bin definitiv Verlinkung gegen Qt 5, ich bin mit Qt Creator und die beiden kits Teste ich mit beiden haben Qt 5.0.1 als Ihren Qt-version.
InformationsquelleAutor dtruby | 2013-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier ist, dass es zwei Signale mit diesem Namen:
QSpinBox::valueChanged(int)
undQSpinBox::valueChanged(QString)
. Von Qt 5.7 gibt es Hilfsfunktionen bereitgestellt, um den gewünschten überlast, so können Sie schreibenQt 5.6 und früher, müssen Sie auf Qt, welches Sie wählen möchten, Gießen Sie es auf die richtige Art:
Ich weiß, es ist hässlich. Aber es gibt keinen Weg, um dieses. Die heutige Lektion ist: nicht überlasten Ihre Signale und slots!
Nachtrag: was ist wirklich ärgerlich über die Besetzung ist, dass
void
(für Signale).So, ich habe mich manchmal über diese C++11-snippet:
Verwendung:
Ich persönlich finde es nicht wirklich nützlich. Ich erwarte, dass dieses problem Weg, indem er sich selbst als Schöpfer (oder der IDE) wird automatisch legen Sie die Rechte Besetzung, wenn autocompleting den Betrieb von Einnahme der PMF. Aber in der Zwischenzeit...
Hinweis: die PMF-basiert verbinden syntax nicht erforderlich C++11!
Nachtrag 2: in Qt 5.7 helper-Funktionen wurden Hinzugefügt, diese zu mildern, in Anlehnung an mein workaround oben. Der wichtigste Helfer ist
qOverload
(Sie haben auchqConstOverload
undqNonConstOverload
).Beispiel (aus der Dokumentation):
Ich war so begeistert von der neuen syntax ... jetzt eine kalte Hauch der eisigen Enttäuschung.
Für diejenigen Fragen, die (wie ich): "pmf" steht für "pointer-to-member-Funktion".
Ich persönlich bevorzuge die
static_cast
Hässlichkeit über die alte syntax, einfach, weil die neue syntax ermöglicht eine compile-time check für die Existenz der signal/slot, wo der alte würde die syntax zur Laufzeit scheitern.Leider, nicht überladen, ein signal ist oft keine option—Qt Häufig überlastungen Ihre eigenen Signale. (z.B.
QSerialPort
)InformationsquelleAutor peppe
Ist die Fehlermeldung:
Der wichtige Teil dabei ist die Erwähnung von "unresolved overloaded function type". Der compiler weiß nicht, ob du meinst
QSpinBox::valueChanged(int)
oderQSpinBox::valueChanged(QString)
.Gibt es eine Handvoll Möglichkeiten, um beheben der überlastung:
Eine geeignete template-parameter
connect()
Diese Kräfte
connect()
zu beheben&QSpinBox::valueChanged
in die überlast, die einenint
.Wenn Sie haben noch überladungen für den slot argument ist, dann benötigen Sie zur Versorgung der zweiten template-argument zu
connect()
. Leider gibt es keine syntax-Fragen für die erste zu folgern, so müssen Sie liefern beides. Das ist, wenn der zweite Ansatz kann helfen:Verwenden Sie eine temporäre variable des richtigen Typs
Die Zuordnung zu
signal
wird, wählen Sie den gewünschten überlast -, und jetzt ist es ausgetauscht werden können, erfolgreich in die Vorlage. Dies funktioniert ebenso gut mit der 'slot' - argument, und ich finde es weniger umständlich, in diesem Fall.Verwenden, eine Konvertierung
Können wir vermeiden, dass
static_cast
hier, weil es einfach ein Zwang eher als die Entfernung von der Sprache, die Schutzvorrichtungen. Ich verwende so etwas wie:Dies erlaubt uns zu schreiben
InformationsquelleAutor Toby Speight
Tatsächlich ist, können Sie nur wickeln Sie Ihre slot mit lambda und so:
wird besser Aussehen. :\
InformationsquelleAutor Newlifer
Die oben genannten Lösungen arbeiten, aber ich löste das auf eine etwas andere Art, mit einem makro, Also nur für den Fall hier ist es:
Fügen Sie diese in Ihren code ein.
Dann, dein Beispiel:
Wird:
Wie verwenden Sie diese für die überladungen, die mehr als ein argument? Nicht das Komma zu Problemen führen? Ich denke, Sie wirklich brauchen, um passieren die parens, D. H.
#define CONNECTCAST(class,fun,args) static_cast<void(class::*)args>(&class::fun)
- alsCONNECTCAST(QSpinBox, valueChanged, (double))
in diesem Fall.es ist ein nützliches makro, wenn Klammern verwendet werden, für die mehrere Argumente, wie in Toby ' s Kommentar
InformationsquelleAutor Basile Perrenoud