Maison >développement back-end >C++ >Comment résoudre les erreurs de compilation Qt 5 lors de la connexion de signaux et d'emplacements surchargés ?

Comment résoudre les erreurs de compilation Qt 5 lors de la connexion de signaux et d'emplacements surchargés ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 18:52:15532parcourir

How to Resolve Qt 5 Compilation Errors When Connecting Overloaded Signals and Slots?

Résoudre les problèmes de connectivité avec des signaux et des emplacements surchargés dans Qt 5

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).

Résolution de la surcharge Problèmes

À 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>(&amp;QSpinBox::valueChanged),
        slider, &amp;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)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);

Alternatives pour les versions antérieures de Qt

Alternatives pour les versions antérieures de Qt
  • Avant Qt 5.7, des approches alternatives peuvent être utilisées pour convertir en fonction appropriée pointeur :
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;
    } 
};
Cette métafonction de modèle dérive le pointeur de fonction souhaité :

connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)

Utilisation :

Améliorations de Qt 5.7

Dans 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<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

// same, with C++11
QOverload<>::of(&amp;Foo:overloadedFunction)
QOverload<int, QString>::of(&amp;Foo:overloadedFunction)

Exemple d'utilisation (extrait de la documentation Qt) :

Documentation sur la surcharge de signal
connect(spinBox, QOverload<const QString &amp;>::of(&amp;QSpinBox::valueChanged),
[=](const QString &amp;text){ /* ... */ });
Dans Qt 5.7 À partir de maintenant, la documentation relative aux signaux surchargés comprend désormais des conseils sur la résolution des problèmes de surcharge des signaux. Par exemple, la documentation QSpinBox pour valueChanged recommande d'utiliser l'assistant qOverload, comme indiqué ci-dessous :

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn