यह बहुत समझ में आता है। मुझे लगता है कि QSignalMapper
वह नहीं है जो आप चाहते हैं। अपने कार्यों तर्क नहीं है, तो, हो सकता है कुछ इस तरह पर्याप्त है:
class SlotForwarder : public QObject
{
Q_OBJECT
public:
typedef void (*Function)(); // or whatever. I never get this syntax right...
SlotForwarder(Function function, QObject* parent = 0)
: QObject(parent)
, m_fptr(function)
{}
public slots:
void forward()
{
m_fptr();
}
private:
Function m_fptr;
};
प्रत्येक कार्य आप संपुटित और हमेशा की तरह forward
से कनेक्ट करना चाहते के लिए एक बनाएं।
अब, अगर वे तर्क है, हो सकता है इस क्यूटी त्रैमासिक लेख सहायता के हो सकता है।
Dynamic Signals and Slots by Eskil A. Blomfeldt
तकनीक qt_metacall
विधि अपने आप को reimplementing शामिल है।
int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)
कॉल metacall की तरह है: स्लॉट, संकेत, पढ़ने या लिखने संपत्ति, आदि हर स्लॉट एक आईडी है विधि इस हस्ताक्षर हैं। तर्क सरणी के अंदर पैरामीटर पैक किए गए हैं (मान या पॉइंटर्स द्वारा)। कोड उत्पन्न करने वाले कोड को पढ़ना एक अच्छा तरीका है यह समझने का एक अच्छा तरीका है कि यह सब कैसे काम करता है।
कच्चे फ़ंक्शन हस्ताक्षर के बारे में डेटा केवल संकलन समय के दौरान उपलब्ध है, लेकिन रनटाइम पर स्लॉट का समाधान किया जाता है। उस विसंगति के कारण, आपको फ़ंक्शंस को टेम्पलेट एडेप्टर प्रकार में लपेटने की आवश्यकता होगी जो qt_metacall
के कार्यान्वयन के लिए निरंतर इंटरफ़ेस प्रस्तुत करता है और arguments
सरणी को फ़ंक्शन समझा सकता है (सीएफ। पायथन unpack ऑपरेटर) में परिवर्तित करता है। Boost.Signals उस तरह का template hackery करता है।
धन्यवाद एक स्लॉट के रूप में किसी भी सदस्य समारोह का उपयोग करने के। यह सामान्य कार्यों के लिए काम करना चाहिए, लेकिन सदस्य कार्यों के लिए नहीं। क्या आप कक्षा सदस्य कार्यों के लिए ऐसा करने के तरीके के बारे में जानते हैं? – blueskin
धन्यवाद एंड्रफ़। मुझे पता चला कि सदस्य tr1 :: बाइंड का उपयोग कर भाग लेता है। मैंने नीचे अपना कोड पोस्ट कर दिया है। एक बार मेरे पास गतिशील UI निर्माण (सहित गतिशील सिग्नल/स्लॉट कनेक्शन) के लिए एक छोटा ऐप है, तो मैं एक लिंक पोस्ट करूंगा। – blueskin