2011-12-20 23 views
34

मैं एक सामान्य इंटरफेस के साथ विगेट्स का पूरा समूह प्रदान करने के लिए सी ++/क्यूटी के लिए कक्षाओं में मिश्रण का उपयोग करने की कोशिश कर रहा हूं। इंटरफ़ेस को इस तरह से परिभाषित किया गया है ताकि यदि इसे अन्य विजेट वर्गों के लिए बेस क्लास के रूप में परिभाषित किया गया हो, तो विजेट में स्वयं ही संकेत होंगे। यानी नीचे देखें।क्यूओब्जेक्ट एकाधिक विरासत

class SignalInterface: public QObject { 
    Q_OBJECT 

    public: 
    SignalInterface(); 
    virtual ~SignalInterface(); 

    signals: 
    void iconChanged(QIcon); 
    void titleChanged(QString); 
} 

class Widget1: public SignalInterface, QWidget{ 

    public: 
    Widget1() 
    virtual ~Widget1() 

    // The Widget Should Inherit the signals 
} 

वर्ग पदानुक्रम समस्या स्पष्ट हो जाता है को देखते हुए, मैं एकाधिक विरासत में खतरनाक हीरा, जहां WIDGET1 QWidget से प्राप्त करना पर ठोकर खाई है, और SignalInterface, और जो दोनों QObject से विरासत। क्या इससे कोई समस्या आएगी?

हम जानते हैं कि QObject क्लास शुद्ध वर्चुअल (जो मामला नहीं है) में यह समस्या आसानी से हल की जा सकती है।

सम्भावित समाधान होगा

class Interface: public QWidget { 
Q_OBJECT 

signals: 
void IconChanged(QIcon); 
void titleChanged(QString); 
} 

class Widget1: public Interface { 

} 

यहां मुद्दा यह है कि मैं पहले से ही QWidget से विरासत कोड का बहुत कुछ है कि है, और उसके हैक करने दर्दनाक है कि में। वहाँ एक और तरीका है?

+0

एक नज़र डालें: http://stackoverflow.com/questions/17943496/declare-abstract-signal-in-interface-class/17943699#17943699 –

उत्तर

42

दुर्भाग्यवश QObject विरासत में दो बार moc में समस्याएं पैदा होंगी।

http://qt-project.org से:

आप एकाधिक वंशानुक्रम का उपयोग कर रहे हैं, तो MOC मानता है कि पहले विरासत में मिला वर्ग QObject का एक उपवर्ग है। साथ ही, सुनिश्चित करें कि केवल पहली विरासत कक्षा एक QObject है।

मैं प्रतिनिधि पैटर्न की तरह कुछ और उपयोग करने का सुझाव दूंगा, या एक आईएसए रिश्ते नहीं है।

5

क्यूटी को एकाधिक विरासत की अनुमति देता है यदि बेस क्लास QObject से निजी रूप से प्राप्त करता है।

उदाहरण:

class Base: private QObject { 
    Q_OBJECT 
    /*Can use signals and slots like any other QObject-derived class*/ 
}; 

class Derived1: public Base { 
    /*Cannot use signals/slots because it does not "see" that Base inherits from QObject*/ 
}; 

class Derived2: public QWidget, public Base { 
    Q_OBJECT 
    /*Can use signals/slots plus has all the functionality of QWidget and Base*/ 
}; 
बेशक

, निजी वंशानुक्रम एक अलग जानवर पूरी तरह है और आप समाधान क्या तुम सच में की जरूरत नहीं दे सकता है। मैं इसका उपयोग तब करता हूं जब मैं बेस क्लास में सिग्नल/स्लॉट का उपयोग कर दूर हो सकता हूं। जब मुझे वास्तव में व्युत्पन्न कक्षा में QObject व्यवहार की आवश्यकता होती है, तो मैं विशेष रूप से उस कक्षा के लिए QObject से प्राप्त करता हूं।

+0

Qt5.9 का उपयोग करके, यह समाधान मॉक के संकलन के दौरान एक त्रुटि करता है जेनरेट की गई फाइलें: 'static_cast': 'QObject *' से 'myClass *' पर संदिग्ध रूपांतरण –

संबंधित मुद्दे