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
DDDoriginal
2024-12-15 16:19:15161parcourir

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

à :

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);

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

Pour Qt 5.6 et versions antérieures :

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);

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;
    } 
};
connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)

Qt 5.7 Fonctions d'assistance :

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)

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!

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