यहां समस्या यह है कि उस नाम के साथ दो संकेत हैं : QSpinBox::valueChanged(int)
और QSpinBox::valueChanged(QString)
। Qt 5.7 से, वांछित अधिभार का चयन करने के लिए सहायक कार्य हैं, जिससे आप लिख सकते हैं
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Qt 5.6 और इससे पहले के लिए, आपको Qt बताने की जरूरत है, जिसे आप चुनना चाहते हैं, इसे सही प्रकार से कास्टिंग करके:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
मुझे पता है, यह बदसूरत है । लेकिन इसके आसपास कोई रास्ता नहीं है। आज का सबक है: अपने सिग्नल और स्लॉट को ओवरलोड न करें!
परिशिष्ट : क्या वास्तव में कलाकारों के बारे में गुस्सा है
- एक वर्ग के नाम को दो बार दोहराता है
- भले ही यह आम तौर पर
void
(संकेतों के लिए) रिटर्न मान निर्दिष्ट करना हो ।
इसलिए मैंने खुद को कभी-कभी इस 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), ...)
मैं व्यक्तिगत रूप से इसे वास्तव में उपयोगी नहीं पाता हूं। मुझे उम्मीद है कि यह समस्या अपने आप दूर हो जाएगी जब क्रिएटर (या आपकी आईडीई) स्वचालित रूप से पीएमएफ लेने के संचालन को स्वत: पूर्ण करते समय सही डाली जाएगी। लेकिन इस बीच ...
नोट: PMF- आधारित कनेक्ट सिंटैक्स को C ++ 11 की आवश्यकता नहीं है !
परिशिष्ट 2 : Qt में 5.7 हेल्पर फ़ंक्शन को इसे कम करने के लिए जोड़ा गया था, जो मेरे वर्कअराउंड के बाद मॉडल किया गया था। मुख्य सहायक है qOverload
(आपको भी मिल गया है qConstOverload
और qNonConstOverload
)।
उपयोग उदाहरण (डॉक्स से):
struct Foo {
void overloadedFunction();
void overloadedFunction(int, QString);
};
// requires C++14
qOverload<>(&Foo:overloadedFunction)
qOverload<int, QString>(&Foo:overloadedFunction)
// same, with C++11
QOverload<>::of(&Foo:overloadedFunction)
QOverload<int, QString>::of(&Foo:overloadedFunction)
परिशिष्ट 3 : यदि आप किसी अतिभारित सिग्नल के प्रलेखन को देखते हैं, तो अब ओवरलोडिंग समस्या का समाधान डॉक्स में स्वयं स्पष्ट रूप से कहा गया है। उदाहरण के लिए, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 कहता है
नोट: सिग्नल मान इस श्रेणी में ओवरलोड है। फ़ंक्शन पॉइंटर सिंटैक्स का उपयोग करके इस सिग्नल से कनेक्ट करने के लिए, क्यूटी फ़ंक्शन पॉइंटर प्राप्त करने के लिए एक सुविधाजनक सहायक प्रदान करता है जैसा कि इस उदाहरण में दिखाया गया है:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });