2013-02-06 12 views
5

से यूआईसी उत्पन्न क्यूटी यूआई कक्षा उत्पन्न करें मेरे पास एक साधारण क्यूटी प्रश्न है। मैं चाहता हूँ कि स्वचालित रूप से उत्पन्न यूआईसी फाइलों में की तरह एक कस्टम इंटरफ़ेस वर्ग से प्राप्त कर रहे:कस्टम इंटरफ़ेस

class Ui_MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 
}; 

namespace Ui { 
    class MyWidget : public MyUiInterface , public Ui_MyWidget {}; 
} 

क्यों:

इरादा

class MyUiInterface { 
public: 
    virtual void setupUi(QWidget* w) = 0; 
    virtual void retranslateUi(QWidget*w) = 0; 
}; 

जनरेट किया यूआईसी फ़ाइल की तरह दिखना चाहिए?

प्रत्येक यूआई :: क्लास MyUiInterface लागू करेगा। यूआई :: कक्षा से प्राप्त प्रत्येक वर्ग में (The Multiple Inheritance Approach देखें) मैं setupUi और retranslateUi पर कॉल करने में सक्षम होगा, जो समझ में आता है कि यूआई :: क्लास क्लास से प्राप्त कक्षा या तो बेस क्लास है। मैं चाहता हूं कि प्रत्येक विजेट को मेरे abstrcat बेस क्लास MyWidgetBase से निकाला जाए। निम्नलिखित पर विचार करें:

class MyWidgetBase abstract : public QWidget, protected MyUiInterface { 
protected: 
    void changeEvent(QEvent *e) { 
     QWidget::changeEvent(e); 
     if (e->type() == QEvent::LanguageChange) { 
      retranslateUi(this); // Still abstract here 
     } 
    } 
}; 

class MyWidget : public MyWidgetBase : public Ui::MyWidget { 
}; 

प्रभाव है, हर बार जब MyWidget :: changeEvent() callled है, उस विशिष्ट वर्ग के retranslateUi कहा जाता है। अन्यथा प्रत्येक वर्ग में परिवर्तन को पुन: कार्यान्वित किया जाना था। यह "कोड पुन: उपयोग" अवधारणा के खिलाफ थोड़ा सा होगा।

मुझे लगता है कि क्यूटी यूआईसी इस स्थिति को संभालने में सक्षम नहीं है? क्या इस समस्या को हल करने का कोई ही तरीका है?

+0

+1 महान प्रश्न! – cmannett85

उत्तर

0

दुर्भाग्यवश, XML Schema for ui files पढ़ना हमें बता रहा है कि यूआईसी कंपाइलर का उपयोग करके स्वचालित करना संभव नहीं है।

हालांकि, यह स्पष्ट नहीं है कि आप इसे स्वचालित रूप से कार्यान्वित क्यों करना चाहते हैं - भले ही यूआईसी किसी भी तरह से आपके इंटरफ़ेस को कार्यान्वित करने का प्रबंधन करे, फिर भी आपको हाथों से कार्यों के निकायों को जोड़ने, जेनरेट करने, क्योंकि मुझे यकीन है कि xml फ़ाइल में कस्टम कोड शामिल करने का कोई तरीका नहीं है जो सी ++ कोड के रूप में अनुवाद करेगा।

आप अपने MyWidget कक्षा में setupUi और retranslateUi को क्यों लागू नहीं करते हैं? प्रत्येक यूआई कक्षा में इन कक्षाओं में से एक होगा, इसलिए आप बेस क्लास के बजाय इस स्तर पर इसे कार्यान्वित कर सकते हैं। यह संभव है कि मुझे कुछ याद आ रहा है, लेकिन मैं इसे करने के लिए एक उचित तरीका के रूप में देखता हूं।

class MyWidget : public MyWidgetBase, public Ui::MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 

}; 
इस दृष्टिकोण के साथ

, आप अपने कस्टम विगेट्स में से किसी में changeEvent() reimplement की जरूरत नहीं है, और अभी भी changeEvent उचित retranslateUi() कॉल करेंगे।

+0

ठीक है, मुझे लगता है कि आपका मतलब है कि सेटअप करें Ii और retranslateUi MyWidgetBase क्लास में वर्चुअल विधियों के रूप में और इसे MyWidget (और MyWidgetBase से व्युत्पन्न सभी अन्य) में लागू करें, Ui :: MyWidget :: setupUi (this) को कॉल करके। यह वास्तव में एक समाधान होगा। मेरे समाधान के साथ जेनरेटेड हेडर फाइलों को संपादित करने की आवश्यकता नहीं है, जिस तरह से यूआईएफ कंपाइलर मेरे इरादे के रूप में काम करेगा :) – bkausbk

+0

@bkausbk दुर्भाग्यवश, जब तक कि कोई यहां किसी भी हैक को नहीं जानता कि यह कैसे करें, मुझे नहीं लगता यह संभव है - लेकिन चलो देखते हैं, मैंने बाद में काम करने के बहुत सारे सामान देखा :) –

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