Le problème ici est qu'il y a deux signaux avec ce nom : QSpinBox::valueChanged(int)
y QSpinBox::valueChanged(QString)
. Depuis Qt 5.7, il existe des fonctions d'aide permettant de sélectionner la surcharge souhaitée, de sorte que vous pouvez écrire
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Pour Qt 5.6 et antérieurs, vous devez dire à Qt lequel vous voulez choisir, en le coulant dans le bon type :
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Je sais, c'est laid . Mais il n'y a pas d'autre solution. La leçon d'aujourd'hui est : ne surchargez pas vos signaux et vos créneaux !
Addendum : ce qui est vraiment ennuyeux avec le casting c'est que
- on répète deux fois le nom de la classe
- on doit spécifier la valeur de retour même si elle est généralement
void
(pour les signaux).
Je me suis donc retrouvé à utiliser parfois cet extrait C++11 :
template<typename... Args> struct SELECT {
template<typename C, typename R>
static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) {
return pmf;
}
};
Utilisation :
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Personnellement, je ne le trouve pas vraiment utile. Je pense que ce problème disparaîtra de lui-même lorsque Creator (ou votre IDE) insérera automatiquement le bon casting lors de l'autocomplétion de l'opération de prise du PMF. Mais en attendant...
Note : la syntaxe connect basée sur PMF ne nécessite pas C++11 !
Addendum 2 Dans Qt 5.7, des fonctions d'aide ont été ajoutées pour atténuer ce problème, sur le modèle de ma solution de contournement ci-dessus. La principale fonction d'aide est qOverload
(vous avez aussi qConstOverload
y qNonConstOverload
).
Exemple d'utilisation (tiré de la documentation) :
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)
Addendum 3 Si vous regardez la documentation de n'importe quel signal surchargé, la solution au problème de surcharge est clairement indiquée dans la documentation elle-même. Par exemple, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 dit
Remarque : le signal valueChanged est surchargé dans cette classe. Pour se connecter à ce signal en utilisant la syntaxe du pointeur de fonction, Qt fournit une aide pratique pour obtenir le pointeur de fonction comme indiqué dans cet exemple :
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });