Qt "निजी स्लॉट:" यह क्या है?


83

मैं समझता हूं कि इसका उपयोग कैसे करना है, लेकिन इसका सिंटैक्स मुझे परेशान करता है। "निजी स्लॉट:" क्या कर रहा है?

मैंने पहले किसी वर्ग परिभाषा में निजी कीवर्ड और: के बीच कुछ नहीं देखा है। क्या कुछ फैंसी सी ++ जादू यहां चल रहा है?

और यहाँ उदाहरण:

 #include <QObject>

 class Counter : public QObject
 {
     Q_OBJECT

 public:
     Counter() { m_value = 0; }

     int value() const { return m_value; }

 public slots:
     void setValue(int value);

 ...

3
यह मानक C ++ नहीं है, यह qt फ्रेमवर्क निर्माण है। लुकअप क्यूटी सिग्नल और स्लॉट
आलोक सेव

1
जब C ++ के रूप में संकलित slotsकिया जाता है #define slots। Qt MOC का उपयोग करते समय यह C ++ कंपाइलर के लिए कोड उत्पन्न करता है।
दिनांक

2
मेरे लिए यह समझना और भी कठिन था क्योंकि मैंने इतनी देर में C ++ का उपयोग किया, मुझे लगा कि उन्होंने कुछ नया जोड़ा है
dtc

जवाबों:


57

स्लॉट C ++ का Qt- विशिष्ट एक्सटेंशन हैं। यह केवल Qt के प्रीप्रोसेसर, मेटा-ऑब्जेक्ट कंपाइलर (moc) के माध्यम से कोड भेजने के बाद संकलित करता है। प्रलेखन के लिए http://doc.qt.io/qt-5/moc.html देखें ।

संपादित करें: जैसा कि फ्रैंक बताते हैं, लिंक करने के लिए moc की आवश्यकता होती है। अतिरिक्त कीवर्ड मानक प्रीप्रोसेसर के साथ # दूर हैं।


धन्यवाद, क्यूटी की प्रीप्रोसेसर वही है जो मैं अपने मानसिक मॉडल में याद कर रहा था कि क्या चल रहा था।
जस्टिन

16
सही नहीं है, कोड हर समय "सिग्नल" के रूप में संकलित करता है और "स्लॉट" खाली परिभाषित करता है इसलिए कंपाइलर उन्हें कभी नहीं देखता है। ये मैक्रोज़ मॉक के लिए संकेत हैं, जो अतिरिक्त कोड उत्पन्न करता है । मूल .h और .cpp फ़ाइलें परिवर्तित नहीं होती हैं और केवल moc के बिना ठीक संकलन करती हैं। क्या असफल हो रहा है लिंकिंग, क्योंकि मोक-जेनरेटेड परिभाषाएँ (सिग्नल परिभाषाएँ, मेटाबॉजेक्ट आदि) अन्यथा गायब हैं।
फ्रैंक ऑस्टरफेल्ड

1
क्या slotsकीवर्ड आवश्यक है? मैंने कुछ छोटे क्यूटी प्रोग्रामों को संकलित / लिंक करने की कोशिश की है जो बिना slotsकीवर्ड के स्लॉट्स को कॉल करते हैं और उन्होंने बिलकुल ठीक बनाया है। मेरे प्रयोगों से पता चलता है कि: signals:निश्चित रूप से आवश्यक है, slotsअनावश्यक हो सकता है, और emitऐसा प्रतीत होता है कि मैंने अन्यत्र पढ़ा है।
इट्स योर ऐप LLC

2
slotsQt5 में आवश्यक नहीं है। Qt ने connect()लंबर फ़ंक्शन सहित सिग्नल को एक मनमाने फ़ंक्शन से कनेक्ट करने की अनुमति देने के लिए सिंटैक्स को अपडेट किया । इस वजह से, slotsआवश्यक नहीं है। हालाँकि, slotsकीवर्ड अभी भी उस तरीके को प्रभावित करता है जो किसी ऑब्जेक्ट का QMetaObjectबनाया गया है। moc(उर्फ, "मेटा-ऑब्जेक्ट कंपाइलर") एक पद्धति को स्लॉट के रूप में तब तक नहीं पहचानेगा जब तक कि वह slots:वर्ग परिभाषा के खंड के भीतर न हो । इसलिए, हालांकि कनेक्शन अभी भी काम करेगा, विधि आत्मनिरीक्षण उपकरण में नहीं दिखाई देगी।
क्रिस

19

जैसे कीवर्ड public, privateQt स्लॉट्स के लिए नजरअंदाज कर दिए जाते हैं। सभी स्लॉट वास्तव में सार्वजनिक हैं और कनेक्ट किए जा सकते हैं


31
जब सिग्नल / स्लॉट तंत्र के माध्यम से विधि को कॉल किया जाता है, तो एक्सेस स्पेसर्स को अनदेखा किया जाता है। लेकिन स्लॉट भी "सामान्य" तरीके हैं। जब आप उन्हें पारंपरिक तरीके से कॉल करते हैं, तो एक्सेस स्पेसिफिकेशन्स पर विचार किया जाता है।
15

4
@ बंदरगाहों और भविष्य के किसी भी पाठक। Qt5 में कनेक्ट () विधि फ़ंक्शन पॉइंटर्स (जिसमें फायदे हैं) का उपयोग कर सकते हैं। यदि आप फ़ंक्शन पॉइंटर्स से कनेक्ट करते हैं तो सिग्नल / स्लॉट तंत्र में एक्सेस स्पेसियर लागू होते हैं।
टॉड

3
@ मुझे लगता है कि यह गलत है, या कम से कम स्पष्टीकरण स्पष्ट नहीं था। पहुँच विनिर्देशक स्लॉट से संकेतों को जोड़ने की आपकी क्षमता को प्रतिबंधित नहीं करते हैं; अर्थात्, एक निजी स्लॉट को किसी भी सिग्नल से जोड़ा जा सकता है । हालाँकि, यह निर्दिष्ट करता है, लेकिन यह निर्दिष्ट किए जाने पर सदस्य फ़ंक्शन को उसके वर्ग (विशिष्ट तरीके से) से बचाता है। इसलिए, सिग्नल / स्लॉट तंत्र के माध्यम से कॉल करने पर एक्सेस स्पेसियर्स को "अनदेखा" नहीं किया जाता है: उन्हें स्लॉट को सिग्नल से जोड़ने का कोई असर नहीं होता है, लेकिन वे फ़ंक्शन को thisउस तरह से सुरक्षित करते हैं जिससे हम परिचित हैं।
इट्स योर ऐप एलएलसी

4

स्लॉट्स को निजी घोषित करने का अर्थ है कि आप उन्हें संदर्भ से संदर्भित नहीं कर पाएंगे, जिसमें वे किसी अन्य विधि की तरह निजी हैं। नतीजतन आप निजी स्लॉट पते को पास नहीं कर पाएंगे connect

यदि आप सिग्नल को निजी घोषित करते हैं, तो आप कह रहे हैं कि केवल यह वर्ग इसे प्रबंधित कर सकता है, लेकिन फ़ंक्शन सदस्य बिंदुओं तक पहुंच प्रतिबंध नहीं है :

class A{
    private:
    void e(){

    }
    public:
    auto getPointer(){
        return &A::e;   
    }
};

int main()
{
    A a;
    auto P=a.getPointer();
    (a.*P)();
}

इसके अलावा, जो अन्य उत्तर का उल्लेख है वह भी मान्य है:
- आप अभी भी निजी सिग्नल और स्लॉट को बाहर से चाल के साथ जोड़ सकते हैं
- signalsऔर slotsखाली मैक्रोज़ हैं और भाषा मानक नहीं तोड़ते हैं


इस प्रश्न का कोई उल्टा प्रभाव क्यों नहीं है? क्या इसमें कुछ गड़बड़ है? मुझे कथन मिला, slotsयह एक स्थूल सहायक है। मैं connectबिना चाल के निजी स्लॉट-फ़ंक्शन-पॉइंटर्स को कनेक्ट नहीं कर सकता , क्या मैं कर सकता हूं?
आर्क लिनक्स टक्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.