Das Problem hierbei ist, dass es zwei Signale mit diesem Namen gibt: QSpinBox::valueChanged(int)
und QSpinBox::valueChanged(QString)
. Ab Qt 5.7 stehen Hilfsfunktionen zur Auswahl der gewünschten Überlastung zur Verfügung, damit Sie schreiben können
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Für Qt 5.6 und früher müssen Sie Qt mitteilen, welches Sie auswählen möchten, indem Sie es auf den richtigen Typ umwandeln:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Ich weiß, es ist hässlich . Aber daran führt kein Weg vorbei. Die heutige Lektion lautet: Überlasten Sie Ihre Signale und Slots nicht!
Nachtrag : Was an der Besetzung wirklich nervt, ist das
- man wiederholt den Klassennamen zweimal
- man muss den Rückgabewert angeben, auch wenn es normalerweise ist
void
(für Signale).
Daher habe ich manchmal dieses C ++ 11-Snippet verwendet:
template<typename... Args> struct SELECT {
template<typename C, typename R>
static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) {
return pmf;
}
};
Verwendung:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Ich persönlich finde es nicht wirklich nützlich. Ich erwarte, dass dieses Problem von selbst verschwindet, wenn Creator (oder Ihre IDE) automatisch die richtige Besetzung einfügt, wenn der Vorgang des Aufnehmens des PMF automatisch abgeschlossen wird. Aber in der Zwischenzeit ...
Hinweis: Die PMF-basierte Verbindungssyntax erfordert kein C ++ 11 !
Nachtrag 2 : In Qt 5.7 wurden Hilfsfunktionen hinzugefügt, um dies zu mildern, modelliert nach meiner obigen Problemumgehung. Der Haupthelfer ist qOverload
(Sie haben auch qConstOverload
und qNonConstOverload
).
Anwendungsbeispiel (aus den Dokumenten):
struct Foo {
void overloadedFunction();
void overloadedFunction(int, QString);
};
// requires C++14
qOverload<>(&Foo:overloadedFunction)
qOverload<int, QString>(&Foo:overloadedFunction)
// same, with C++11
QOverload<>::of(&Foo:overloadedFunction)
QOverload<int, QString>::of(&Foo:overloadedFunction)
Anhang 3 : Wenn Sie sich die Dokumentation eines überlasteten Signals ansehen, ist die Lösung des Überlastungsproblems jetzt in den Dokumenten selbst klar angegeben. Zum Beispiel sagt https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1
Hinweis: Signal valueChanged ist in dieser Klasse überladen. Um mithilfe der Funktionszeigersyntax eine Verbindung zu diesem Signal herzustellen, bietet Qt einen praktischen Helfer zum Abrufen des Funktionszeigers, wie in diesem Beispiel gezeigt:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });