Qt में मॉडल-व्यू-प्रस्तोता को लागू करना

एक परियोजना की वास्तुकला को डिजाइन करते समय, वह एमवीपी पैटर्न पर बस गए - उन्होंने यूआई को आसानी से बदलने की क्षमता का भंडाफोड़ किया, साथ ही साथ परीक्षणों के साथ कवरेज में आसानी। सभी MVP कार्यान्वयन उदाहरण जो मुझे नेटवर्क पर मिले C # में थे। Qt पर लागू करते समय, कुछ स्पष्ट क्षण दिखाई दिए, जिसका समाधान सफलतापूर्वक मिल गया। जानकारी नीचे एकत्र की।

एमवीपी की कहानी


जैसा कि [1] और [२] से है, एमवीपी डिज़ाइन पैटर्न एमवीसी का एक संशोधन है, जो पहली बार आईबीएम द्वारा पिछली शताब्दी के ९ ० के दशक में उपयोग किया गया था जब ऑब्जेक्ट-ओरिएंटेड ऑपरेटिंग सिस्टम टैलिगेंट पर काम कर रहा था। बाद में, एमवीपी को माइक मोटल द्वारा विस्तार से वर्णित किया गया था।

एमवीपी और एमवीसी के बीच अंतर क्या है, यह देखने के लिए आप संबंधित पैराग्राफ पर देख सकते हैं [3]: एमवीसी , एमवीपी

Qt में MVP लागू करें


सामान्य तौर पर, एमवीपी पहले से ही क्यूटी में निहित है, जैसा कि [4] में दिखाया गया है:

छवि

लेकिन ऐसे एमवीपी कार्यान्वयन के कई नुकसान हैं:

एक पूर्ण MVP कार्यान्वयन इस तरह दिखेगा:

छवि

इसलिए वर्ग आरेख:

छवि

प्रत्येक वर्ग पर विचार करें:

"ड्राइंग स्क्वायर" के चरण में सब कुछ स्पष्ट है। मुझे इसे लागू करने की कोशिश करने में समस्या थी।
  1. IView लिखते समय, आपको संकेतों की घोषणा करनी चाहिए। लेकिन इसके लिए, IView को QObject से विरासत में लिया जाना चाहिए। फिर, जब एक ही समय में QWidget और IView से व्यू इनहेरिट करने की कोशिश की गई, तो एक त्रुटि हुई। यह पता चला कि कक्षा को एक साथ दो QObject ऑब्जेक्ट से विरासत में नहीं मिला जा सकता है (यहां तक ​​कि वर्चुअल इनहेरिटेंस ने भी मदद नहीं की)। इस समस्या से कैसे निजात पाएं [5]: लिंक में दिखाया गया है। इस प्रकार, IView QObject से विरासत में नहीं मिला है और केवल सार्वजनिक खंड में संकेतों को पूरी तरह से आभासी (सार) के रूप में घोषित करता है। यह काफी तार्किक है, क्योंकि सिग्नल भी एक फ़ंक्शन है जिसे कॉल करके पर्यवेक्षकों को उनके स्लॉट्स के माध्यम से सूचित किया जाता है (ऑब्जर्वर पैटर्न देखें)।
  2. प्रस्तुतकर्ता वर्ग में IVIV संकेतों को बाइंड करते समय एक और समस्या उत्पन्न हुई। तथ्य यह है कि प्रस्तुतकर्ता में IView का लिंक शामिल है (एक विशिष्ट दृश्य रन टाइम में प्रस्तुतकर्ता में जोड़ा जाता है, लेकिन IView के रूप में संग्रहीत - बहुरूपता का उपयोग किया जाता है)। लेकिन संकेतों और स्लॉट्स को जोड़ने के लिए, स्थिर QObject::connect() विधि का उपयोग किया जाता है, जो केवल QObject वंशज को ऑब्जेक्ट के रूप में स्वीकार करता है, और IView नहीं है। लेकिन हम जानते हैं कि हमारा कोई भी दृश्य यह होगा। इसलिए समस्या को गतिशील प्रकार के रूपांतरण द्वारा हल किया जाता है, जैसा कि [6] में दिखाया गया है:

    QObject   * view_obj   =   dynamic_cast < QObject *>( m_view );   //     m_view   -   IView
    QObject :: connect ( view_obj ,   SIGNAL ( okActionTriggered ()),
                      this ,   SLOT ( processOkAction ()));


यह भी ध्यान देने योग्य है कि IVIV को लागू करते समय, केवल हेडर (.h) फ़ाइल की आवश्यकता होती है। यदि आईवीक्यू के लिए एक .cpp फ़ाइल बनाई जाती है, तो उसे हटा दिया जाना चाहिए, अन्यथा संकलन समस्याएं हो सकती हैं।

सिद्धांत रूप में, यह जानकारी Qt में स्वतंत्र रूप से एमवीपी को लागू करने के लिए पर्याप्त है, लेकिन मैं एक साधारण उदाहरण (केवल एमवीपी कार्यान्वयन, एक वास्तविक अनुप्रयोग के संदर्भ में बातचीत पर विचार किए बिना) दूंगा।

Qt में MVP का उपयोग करने का एक सरल उदाहरण


पुरालेख में 3 उदाहरण हैं, यह एक ही अनुप्रयोग है, लेकिन प्रत्येक उदाहरण में परिवर्धन के साथ।
  1. एमवीपी कार्यान्वयन
  2. कई विचारों को बनाने की क्षमता जोड़ा गया
  3. जब डेटा बदलता है तो विचारों के बीच पूर्ण सिंक्रनाइज़ेशन

सभी कोड Doxygen शैली में टिप्पणी की गई है, अर्थात आप Doxywizard का उपयोग करके आसानी से प्रलेखन उत्पन्न कर सकते हैं।

यहाँ उदाहरण डाउनलोड करें

दायरे से बाहर


इस विषय पर दिलचस्प सवालों की एक सूची है जो लेख में शामिल नहीं थे:

इन मुद्दों पर कोई भी जानकारी टिप्पणियों में स्वागत योग्य है।

सूत्रों का कहना है


  1. http://www.rsdn.ru/article/patterns/generic-mvc2.xml
  2. http://en.wikipedia.org/wiki/Model-view-presenter
  3. http://www.rsdn.ru/article/patterns/ModelViewPresenter.xml
  4. http://thesmithfam.org/blog/2009/09/27/model-view-presenter-and-qt/
  5. http://doc.trolltech.com/qq/qq15-academic.html
  6. http://developer.qt.nokia.com/forums/viewthread/284

Source: https://habr.com/ru/post/In107698/


All Articles