क्या Qt वर्चुअल शुद्ध स्लॉट का समर्थन करता है?


97

मेरे GUI प्रोजेक्ट में Qtबहुत सारे "कॉन्फ़िगरेशन पृष्ठ" वर्ग हैं जो सभी सीधे से प्राप्त करते हैं QWidget

हाल ही में, मुझे एहसास हुआ कि ये सभी वर्ग 2 कॉमन्स स्लॉट ( loadSettings()और saveSettings()) साझा करते हैं।

इस बारे में, मेरे दो सवाल हैं:

  • क्या BaseConfigurationPageइन दो स्लॉट्स को वर्चुअल प्योर मेथड्स के साथ इंटरमीडिएट बेस एब्स्ट्रैक्ट क्लास (इसे नाम देने देता है ) लिखने का कोई मतलब है ? (हर संभव कॉन्फ़िगरेशन पेज में हमेशा ये दो तरीके होंगे, इसलिए मैं "हाँ" कहूंगा)
  • इससे पहले कि मैं अपने कोड में भारी बदलाव करूं (अगर मुझे करना है): क्या Qt वर्चुअल शुद्ध स्लॉट का समर्थन करता है? क्या मुझे कुछ पता होना चाहिए?

यहाँ सब कुछ का वर्णन एक कोड उदाहरण है:

class BaseConfigurationPage : public QWidget
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    virtual void loadSettings() = 0;
    virtual void saveSettings() = 0;
};

class GeneralConfigurationPage : public BaseConfigurationPage
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    void loadSettings();
    void saveSettings();
};

जवाबों:


164

हां, नियमित सी ++ शुद्ध आभासी तरीकों की तरह। MOC द्वारा उत्पन्न कोड शुद्ध आभासी स्लॉट्स को कॉल करता है, लेकिन यह ठीक है क्योंकि बेस क्लास को वैसे भी त्वरित नहीं किया जा सकता है ...

फिर से, नियमित सी ++ शुद्ध आभासी तरीकों की तरह, क्लास को तब तक त्वरित नहीं किया जा सकता है जब तक कि तरीकों को एक कार्यान्वयन नहीं दिया जाता है।

एक बात: उपवर्ग में, आप वास्तव में स्लॉट के रूप में ओवरराइड विधियों को चिह्नित करने की आवश्यकता नहीं है। सबसे पहले, वे पहले से ही बेस क्लास में स्लॉट के रूप में कार्यान्वित किए जाते हैं। दूसरा, आप MOC और कंपाइलर के लिए अधिक काम कर रहे हैं क्योंकि आप एक (छोटे) बिट कोड को जोड़ रहे हैं। तुच्छ, लेकिन जो भी हो।

तो, इसके लिए जाओ ..


1
आपके सटीक उत्तर के लिए धन्यवाद! मैं जल्द से जल्द इसका परीक्षण करूँगा;)
ऑन

3
उपवर्ग से स्लॉट विनिर्देश हटाने से उप उप और आधार वर्ग को कॉल करने से रोकता है! - धन्यवाद दोस्त!
fmuecke

क्यूटी 5 में, कम से कम, आप उपयोग कर रहे हैं obj-ptr, member-func-ptr, obj-ptr, member-func-ptrके संस्करण connect, कोई भी अपने स्लॉट में से करने की आवश्यकता घोषित जैसे।
काइल स्ट्रैंड

कुछ वास्तव में अजीब व्यवहार जोड़ना पड़ता है: जब आप उप-वर्ग के शीर्षलेख में स्लॉट के रूप में ओवरराइड विधियों को चिह्नित करते हैं, तो स्लॉट्स उन्हें हर समय 0 कनेक्शन के साथ भी बुलाया जाता है। जाओ पता लगाओ!!!
बरदो

2

बेसकोनफिगरेशनपेज में केवल स्लॉट

class BaseConfigurationPage : public QWidget
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    virtual void loadSettings() = 0;
    virtual void saveSettings() = 0;
};

class GeneralConfigurationPage : public BaseConfigurationPage
{
  // Some constructor and other methods, irrelevant here.

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