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
Libérer: 2024-12-09 18:52:15
original
530 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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;
    } 
};
Copier après la connexion
Cette métafonction de modèle dérive le pointeur de fonction souhaité :

connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)
Copier après la connexion

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)
Copier après la connexion

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){ /* ... */ });
Copier après la connexion
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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal