Maison > développement back-end > C++ > Comment résoudre les connexions signal-emplacement surchargées dans Qt 5 ?

Comment résoudre les connexions signal-emplacement surchargées dans Qt 5 ?

DDD
Libérer: 2024-12-15 16:19:15
original
154 Les gens l'ont consulté

How to Resolve Overloaded Signal-Slot Connections in Qt 5?

Résolution des connexions signal-slot surchargées dans Qt 5

Qt 5 a introduit une nouvelle syntaxe signal-slot utilisant des pointeurs vers des fonctions membres, visant à améliorer la lisibilité et l'extensibilité. Cependant, cela présentait des défis lors de la connexion à des signaux surchargés.

Problème rencontré

Lors d'une tentative de mise à jour du code à l'aide de la nouvelle syntaxe, de :

QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                 slider, SLOT(setValue(int));
Copier après la connexion

à :

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);
Copier après la connexion

des erreurs de compilation se sont produites en raison de problèmes de fonction surchargés non résolus.

Signal surchargé Résolution

Le problème vient de l'existence de deux signaux surchargés nommés QSpinBox::valueChanged(int) et QSpinBox::valueChanged(QString). Qt fournit des fonctions d'assistance pour résoudre cette surcharge.

Pour Qt 5.7 et versions ultérieures :

connect(spinbox, qOverload<int>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Copier après la connexion

Pour Qt 5.6 et versions antérieures :

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Copier après la connexion

Ce casting explicite, bien que lourd, est nécessaire pour préciser le signal souhaité. Il est fortement conseillé d'éviter de surcharger les signaux et les slots.

Alternatives

Solution de contournement 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
connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)
Copier après la connexion

Qt 5.7 Fonctions d'assistance :

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)
Copier après la connexion

Consulter le Documentation Qt pour les dernières informations sur la gestion des signaux et des slots surchargés.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal