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.
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.
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>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Pour Qt 5.6 et versions antérieures :
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &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.
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(&QSpinBox::valueChanged), ...)
Qt 5.7 Fonctions d'assistance :
qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&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!