এখানে সমস্যাটি হ'ল সেই নামের সাথে দুটি সংকেত রয়েছে: QSpinBox::valueChanged(int)
এবং QSpinBox::valueChanged(QString)
। কিউটি 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);
আমি জানি, এটা কুশ্রী । তবে এর আশেপাশে কোনও উপায় নেই। আজকের পাঠটি হ'ল: আপনার সংকেত এবং স্লটগুলি ওভারলোড করবেন না!
সংযোজন : theালাই সম্পর্কে সত্যিই বিরক্তিকর কি তা
- একজন ক্লাসের নামটি পুনরাবৃত্তি করে
- একটিকে সাধারণত
void
(সংকেতগুলির জন্য) হলেও রিটার্ন মান নির্দিষ্ট করতে হয় ।
তাই আমি মাঝে মাঝে নিজেকে এই সি ++ 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), ...)
আমি ব্যক্তিগতভাবে এটি সত্যিই দরকারী না বলে মনে করি। আমি আশা করি যখন পিএমএফ নেওয়ার ক্রিয়াকলাপটি স্বয়ংক্রিয়ভাবে পূর্ণ করা হবে তখন নির্মাতা (বা আপনার আইডিই) স্বয়ংক্রিয়ভাবে সঠিক কাস্টটি প্রবেশ করবে তখন এই সমস্যাটি নিজে থেকে দূরে চলে যাবে I তবে এর মধ্যে ...
দ্রষ্টব্য: পিএমএফ-ভিত্তিক সংযোগ সিনট্যাক্সের জন্য সি ++ 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 বলে
দ্রষ্টব্য: সিগন্যাল মান পরিবর্তিত এই শ্রেণিতে ওভারলোড হয়। ফাংশন পয়েন্টার সিনট্যাক্স ব্যবহার করে এই সংকেতটির সাথে সংযোগ স্থাপন করতে, Qt এই উদাহরণে প্রদর্শিত হিসাবে ফাংশন পয়েন্টার প্রাপ্ত করার জন্য একটি সুবিধাজনক সহায়ক সরবরাহ করে:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });