संक्षिप्त जवाब
Qt का MVC केवल एक डेटा संरचना पर लागू होता है । एमवीसी एप्लिकेशन के बारे में बात करते समय आपको इसके बारे में QAbstractItemModel
या नहीं सोचना चाहिए QListView
।
यदि आप अपने पूरे प्रोग्राम के लिए MVC आर्किटेक्चर चाहते हैं, तो Qt ने ऐसा "विशाल" मॉडल / व्यू फ्रेमवर्क नहीं बनाया है। लेकिन अपने कार्यक्रम में डेटा की प्रत्येक सूची / पेड़ के लिए आप Qt MVC दृष्टिकोण का उपयोग कर सकते हैं जो वास्तव में इसके दृश्य के भीतर एक नियंत्रक है । डेटा के भीतर या मॉडल के बाहर है; यह इस बात पर निर्भर करता है कि आप किस प्रकार के मॉडल का उपयोग कर रहे हैं (स्वयं का मॉडल उपवर्ग: संभवतः मॉडल के भीतर; उदाहरण के लिए QSqlTableModel: बाहर (लेकिन शायद मॉडल के भीतर कैश किया गया)। अपने मॉडल और विचारों को एक साथ रखने के लिए, स्वयं की कक्षाओं का उपयोग करें जो तब व्यावसायिक तर्क को लागू करते हैं ।
लंबा जवाब
Qt का मॉडल / दृष्टिकोण और शब्दावली:
Qt अपने मॉडलों के लिए सरल विचार प्रदान करता है । उनके पास एक नियंत्रक बनाया गया है: आइटम का चयन, संपादन और आगे बढ़ना कुछ ऐसा है जो ज्यादातर मामलों में एक नियंत्रक "नियंत्रण" करता है। यही है, उपयोगकर्ता इनपुट (माउस क्लिक और मूव्स) की व्याख्या करना और मॉडल को उपयुक्त कमांड देना।
Qt के मॉडल वास्तव में अंतर्निहित डेटा वाले मॉडल हैं। पाठ्यक्रम के सार मॉडल डेटा नहीं रखते हैं, क्योंकि क्यूटी को नहीं पता है कि आप उन्हें कैसे स्टोर करना चाहते हैं। लेकिन आप अपने डेटा कंटेनरों को उपवर्ग में जोड़कर और मॉडल इंटरफ़ेस को अपने डेटा तक पहुंच बनाकर अपनी आवश्यकताओं के लिए QAbstractItemModel का विस्तार करते हैं। तो वास्तव में, और मुझे लगता है कि आप इसे पसंद नहीं करते हैं, समस्या यह है कि आपको मॉडल को प्रोग्राम करने की आवश्यकता है, इसलिए डेटा को आपके डेटा संरचना में कैसे एक्सेस और संशोधित किया जाता है।
एमवीसी शब्दावली में, मॉडल में डेटा और तर्क दोनों शामिल हैं । Qt में, यह आपके ऊपर है कि आप अपने व्यवसाय के कुछ तर्क अपने मॉडल के अंदर शामिल करते हैं या बाहर रख देते हैं, अपने आप में एक "दृश्य" है। यह भी स्पष्ट नहीं है कि तर्क से क्या मतलब है: चयन करना, नाम बदलना और चारों ओर घूमना? => पहले से ही लागू। उनके साथ गणना कर रहे हैं? => इसे मॉडल उपवर्ग के बाहर या अंदर रखें। एक फ़ाइल से / से डेटा संग्रहीत या लोड करना? => इसे मॉडल उपवर्ग के अंदर रखें।
मेरी निजी राय:
एक प्रोग्रामर को एक अच्छा और सामान्य एमवी (सी) सिस्टम प्रदान करना बहुत मुश्किल है । क्योंकि ज्यादातर मामलों में मॉडल सरल होते हैं (जैसे केवल स्ट्रिंग सूची) क्यूटी भी एक तैयार-से-उपयोग QStringListModel प्रदान करता है। लेकिन अगर आपका डेटा स्ट्रिंग्स की तुलना में अधिक जटिल है, तो यह आपके ऊपर है कि आप Qt मॉडल / व्यू इंटरफ़ेस के माध्यम से डेटा का प्रतिनिधित्व कैसे करना चाहते हैं। यदि आपके पास, उदाहरण के लिए, 3 फ़ील्ड वाली संरचना (नाम, आयु और लिंग वाले व्यक्ति कहते हैं) तो आप 3 फ़ील्ड को 3 अलग-अलग कॉलम या 3 अलग-अलग भूमिकाओं के लिए असाइन कर सकते हैं। मुझे दोनों दृष्टिकोण पसंद नहीं हैं।
मुझे लगता है कि Qt का मॉडल / व्यू फ्रेमवर्क केवल तभी उपयोगी है जब आप सरल डेटा संरचनाओं को प्रदर्शित करना चाहते हैं । अगर डेटा कस्टम प्रकार का है या संरचित नहीं है, तो इसे संभालना मुश्किल हो जाता है, न कि किसी पेड़ या सूची में (उदाहरण के लिए ग्राफ)। ज्यादातर मामलों में, सूचियां पर्याप्त हैं और यहां तक कि कुछ मामलों में, एक मॉडल को केवल एक ही प्रविष्टि रखना चाहिए। खासकर यदि आप एक एकल प्रविष्टि को अलग-अलग विशेषताओं (एक वर्ग का एक उदाहरण) के मॉडल के लिए चाहते हैं, तो क्यूटी के मॉडल / दृश्य रूपरेखा उपयोगकर्ता इंटरफ़ेस से तर्क को अलग करने का सही तरीका नहीं है।
चीजों को योग करने के लिए, मुझे लगता है कि क्यूटी के मॉडल / व्यू फ्रेमवर्क उपयोगी है यदि और केवल यदि आपके डेटा को क्यूटी के दर्शक विजेट में से एक द्वारा देखा जा रहा है । यह पूरी तरह से बेकार है यदि आप केवल एक प्रविष्टि, जैसे आपके एप्लिकेशन की सेटिंग, या यदि आपका डेटा प्रिंट करने योग्य प्रकारों का नहीं है, तो किसी मॉडल के लिए अपना व्यूअर लिखने ही वाला है।
मैंने (बड़े) एप्लिकेशन के भीतर Qt मॉडल / दृश्य का उपयोग कैसे किया?
मैंने एक बार (एक टीम में) एक एप्लिकेशन लिखा था जो डेटा का प्रबंधन करने के लिए कई क्यूटी मॉडल का उपयोग करता है। हमने DataRole
वास्तविक डेटा को रखने के लिए एक बनाने का फैसला किया जो प्रत्येक अलग-अलग मॉडल उपवर्ग के लिए एक अलग कस्टम प्रकार का था। हमने एक बाहरी मॉडल वर्ग बनाया, जिसे Model
सभी अलग-अलग क्यूटी मॉडल कहा जाता है । हमने एक बाहरी दृश्य वर्ग भी बनाया है, जिसे View
विंडोज़ (विगेट्स) कहा जाता है , जो मॉडल से जुड़े होते हैं Model
। तो यह दृष्टिकोण एक विस्तारित Qt MVC है, जो हमारी अपनी आवश्यकताओं के लिए अनुकूल है। दोनों Model
और View
वर्गों को स्वयं Qt MVC से कोई लेना देना नहीं है।
हमने तर्क कहाँ रखा ? हमने ऐसी कक्षाएं बनाईं, जिन्होंने स्रोत मॉडल (जब वे बदले) से डेटा पढ़कर और लक्ष्य मॉडल में परिणाम लिखकर डेटा पर वास्तविक गणना की। क्यूटी के दृष्टिकोण से, यह तर्क कक्षाएं दृश्य होंगी, क्योंकि वे मॉडल से "कनेक्ट" करते हैं (उपयोगकर्ता के लिए "दृश्य" नहीं, लेकिन एप्लिकेशन के व्यावसायिक तर्क भाग के लिए एक "दृश्य")।
नियंत्रक कहां हैं ? मूल MVC शब्दावली में, नियंत्रक उपयोगकर्ता इनपुट (माउस और कीबोर्ड) की व्याख्या करते हैं और अनुरोध किए गए कार्य को करने के लिए मॉडल को कमांड देते हैं। चूंकि क्यूटी विचार पहले से ही उपयोगकर्ता इनपुट की व्याख्या करते हैं जैसे कि आइटम का नाम बदलना और आगे बढ़ना, इसकी आवश्यकता नहीं थी। लेकिन जिस चीज की हमें जरूरत थी, वह यूजर इंटरैक्शन की व्याख्या थी जो Qt के विचारों से परे है।