Lors de la tentative de connexion de signaux et d'emplacements surchargés à l'aide de la nouvelle syntaxe de fonction pointeur vers membre dans Qt 5 , certains utilisateurs rencontrent des erreurs de compilation. Cet article aborde le problème sous-jacent et propose des solutions pour le résoudre.
Dans l'exemple fourni, qui implémente une connexion entre le signal valueChanged d'un QSpinBox et le slot setValue d'un QSlider, l'erreur provient de l'existence de deux signaux avec le même nom : valueChanged(int) et valueChanged(QString).
À partir de Qt 5.7, des fonctions d'assistance ont été introduites pour aider à résoudre la surcharge de signal. Ces fonctions permettent de préciser la surcharge souhaitée. Dans ce cas, il est possible d'utiliser :
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Pour les versions antérieures de Qt, un cast explicite est requis pour indiquer la surcharge souhaitée :
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
template<typename... Args> struct SELECT { template<typename C, typename R> static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { return pmf; } };
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Améliorations de Qt 5.7Dans Qt 5.7, des fonctions d'assistance ont été ajoutées pour rationaliser le processus de sélection des signaux surchargés. L'assistant principal est qOverload (avec des variantes telles que qConstOverload et qNonConstOverload).
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)
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), [=](const QString &text){ /* ... */ });
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!