2009-11-02 17 views
26

कृपया, पीईक्यूटी के साथ एमवीसी-पैटर्न डिजाइन करने में मेरी सहायता करें। मैं 3 भागों में सभी कार्यक्रम विभाजित करना चाहते हैं:पीईक्यूटी और एमवीसी-पैटर्न

  1. कुछ वर्ग है कि सभी क्यूटी वर्गों (मॉडल) से निकाला गया है
  2. कुछ वर्ग कि क्यूटी-ऐप को मॉडल से डेटा प्रदान करता है (नियंत्रक)
  3. क्यूटी - परिभाषित विधि सिग्नल टॉस्लॉट्स के साथ स्वयं को लागू करें जो नियंत्रक के साथ सिग्नल कनेक्ट करता है।

क्या यह बेहतर है और पीईक्यूटी विकास में कौन सी योजना का उपयोग किया जाता है?

पी.एस .: मेरी अंग्रेजी के लिए खेद है =)

उत्तर

38

पहले आप यह कर सकते में से एक क्यूटी 4 डिजाइनर का उपयोग अपने जीयूआई डिजाइन और pyuic4 का उपयोग अपने अजगर जीयूआई उत्पन्न करने के लिए है। यह आपका विचार होगा, आप कभी भी इन पायथन फ़ाइलों को हाथ से संपादित नहीं करेंगे। डिजाइनर का उपयोग करके हमेशा परिवर्तन करें, यह सुनिश्चित करता है कि आपका दृश्य आपके मॉडल और नियंत्रण से अलग है।

नियंत्रण तत्व के लिए, एक केंद्रीय वर्ग बनाएं जो आपके बेस gui विजेट जैसे QMainWindow से प्राप्त होता है। इस ऑब्जेक्ट के बाद में एक सदस्य ui होगा जो आपकी दृश्य वस्तु है जिसे आपने अभी बनाया है।

यहां से a tutorial

अद्यतन 2013 एक उदाहरण है: यहाँ एक और हाल ही में ट्यूटोरियल (रों) PyQt और MVC मॉडल पर PyQt MVC Tutorial Series

import sys 
from PyQt4 import QtCore, QtGui 
from edytor import Ui_notepad 

class StartQT4(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_notepad() 
     self.ui.setupUi(self) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = StartQT4() 
    myapp.show() 
    sys.exit(app.exec_()) 

ऊपर के उदाहरण में प्रमुख मुद्दा नियंत्रक है यूईई है और इसे सीधे प्राप्त नहीं करता है। नियंत्रक आपके गुई के लिए सिग्नल स्लॉट कनेक्शन के प्रबंधन के लिए जिम्मेदार होगा और आपको डेटा मॉडल के लिए एक इंटरफ़ेस प्रदान करेगा।

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

यहाँ इस बातचीत का एक छोटा सा उदाहरण है (अपरीक्षित, कुछ लेखन-त्रुटियों हो सकता है):

class Movie(): 
    def __init__(self,title=None,year=None,genre=None): 
     self.title=title 
     self.year=year 
     self.genre=genre 
    def update(self,title=None,year=None,genre=None): 
     self.title=title 
     self.year=year 
     self.genre=genre 
    def to_xml(self,title=None,date=None,genre=None): 
     pass #not implementing this for an example! 

#when the controller tries to update it should use update function 
movie1.update("Manos Hands Of Fate",1966,"Awesome") 
#don't set by direct access, your controller shouldn't get that deep 
movie1.title="Bad Idea" #do not want! 

यह भी MVC में महत्वपूर्ण पहुँच केंद्रीकृत करने के लिए है, का कहना है कि उपयोगकर्ता डबल उस पर क्लिक करके शीर्षक बदल सकते हैं स्क्रीन, या शीर्षक फ़ील्ड के बगल में संपादित करें क्लिक करके, उन इंटरफेस के दोनों परिवर्तन के लिए एक ही विधि का उपयोग करना समाप्त कर देना चाहिए। और इसके द्वारा मेरा मतलब यह नहीं है कि प्रत्येक व्यक्ति movie.update_title (शीर्षक) कहता है। मेरा मतलब है कि दोनों संकेतों को नियंत्रक में एक ही विधि का उपयोग करना चाहिए।

व्यू और नियंत्रक के बीच सभी रिश्तों को 1 से 1 तक करने के लिए जितना संभव हो उतना प्रयास करें। मतलब, आपके पास गुई में कुछ बदलने के 5 तरीके हैं, इसे नियंत्रित करने के लिए नियंत्रक में 1 विधि है। यदि स्लॉट प्रत्येक विधियों के लिए विधियों को बनाने से सभी संगत नहीं हैं जो तब एक विधि को कॉल करते हैं। यदि आप 5 व्यू शैलियों के लिए समस्या को 5 बार हल करते हैं तो दृश्य को दृश्य से अलग करने का वास्तव में और कारण नहीं है।इसके अलावा अब आपके पास नियंत्रक में कुछ करने का एकमात्र तरीका है, इसलिए आप नियंत्रण और मॉडल के बीच एक अच्छा 1 से 1 संबंध रखते हैं।

जहाँ तक अपने मॉडल पूरी तरह से क्यूटी से अलग होने के रूप में, जो वास्तव में आवश्यक नहीं है और वास्तव में आप के लिए कठिन जीवन बना सकते हैं। आपके मॉडल में क्यूएसट्रिंग जैसी चीजों का उपयोग सुविधाजनक हो सकता है, और यदि किसी अन्य एप्लिकेशन में आप गुई के ओवरहेड नहीं चाहते हैं, लेकिन मॉडल चाहते हैं कि केवल क्यूटीकोर ही आयात करें। उम्मीद है कि यह मदद करता है!

+1

+1, 'सीधी पहुँच द्वारा निर्धारित नहीं है का उपयोग करते हुए एक दूसरे से संवाद के लिए अपने नियंत्रक shouldn ' टी गहराई प्राप्त नहीं करें: 'self._title = शीर्षक की संभावना का उल्लेख क्यों न करें; self._year = साल; ... '? – mlvljr

+0

मैन्युअल रूप से आपके दृश्य को संपादित करने का कारण यह आपके मॉडल और नियंत्रण से अलग नहीं होगा? – Kemeia

+0

यह इसका कारण नहीं है, लेकिन ऐसा नहीं कर रहा है ** ** इसे रोकता है – cmaynard

6

हाँ, PyQt मॉडल/देखें अवधारणा का उपयोग करता (आधिकारिक तौर पर "नियंत्रक" भाग के बिना), लेकिन हो सकता है आप कुछ हद तक एक विकृत चित्र क्या यह PyQt में मतलब है की है।

  1. मॉडल, उचित PyQt आधार सार मॉडल वर्गों (QAbstractItemModel, QAbstractTableModel, QAbstractListModel, आदि) से subclassed:

    दो भागों रहे हैं। ये मॉडल सीधे आपके डेटा स्रोतों से बात कर सकते हैं (फाइलें, डेटाबेस), या प्रॉक्सी अपने स्वयं के पीईक्यूटी-अज्ञेय मॉडल जो पहले लिखे गए थे।

  2. दृश्य है, जो क्यूटी लाइब्रेरी में लागू किया जाता है, और अक्सर किसी भी संशोधन (उदाहरण: QTreeView, QTableView और अन्य) की आवश्यकता नहीं है। यहां तक ​​कि कुछ सरल नियंत्रण, जैसे QComboBox एक पीईक्यूटी मॉडल के लिए एक दृश्य के रूप में कार्य कर सकते हैं।

आपके आवेदन के अन्य सभी हिस्सों, जो संकेतों पर प्रतिक्रिया करते हैं, आदि को "नियंत्रक" के रूप में माना जा सकता है।

PyQt भी पूर्वनिर्धारित "सार्वभौमिक" मॉडल जो subclassed जा सकता है या सीधे इस्तेमाल किया है, तो आप मॉडल से केवल सरल कार्यक्षमता की जरूरत है, QStringListModel, QStandardItemModel, आदि जैसे और वहाँ भी मॉडल जो डेटाबेस से सीधे बात कर सकते हैं का एक सेट प्रदान , QSqlTableModel की तरह।

+1

ध्यान दें कि क्यूटी में मॉडल/व्यू फ्रेमवर्क रिकर्सिव टेबल तक सीमित है (हालांकि विचार मुख्य रूप से सूचियों, पंक्तियों, तालिकाओं और पुनरावर्ती पंक्तियों (पेड़ का समर्थन करते हैं)))। पीईक्यूटी/क्यूटी में जेनेरिक एमवीसी ऐप्स बनाना संभव है जो क्यूटी के मॉडल व्यू-फ्रेमवर्क का उपयोग नहीं करते हैं, यदि आपके डेटा की एक अलग संरचना है। (आईएमएचओ, क्यूटी के मॉडल व्यू में सामान को मजबूर करना हमेशा सबसे अच्छा विचार नहीं है ...) – Macke

+0

वास्तव में ~ मुझे अभी भी क्यूटी के मॉडल/व्यू फ्रेमवर्क w/o नियंत्रक का असली विचार नहीं मिलता है। – Drake

+0

यह कोड पुन: उपयोग बेहतर बनाता है। यह काफी आम है जब आप बिल्कुल उसी मॉडल वर्ग या विभिन्न विचारों के साथ उदाहरण का उपयोग करते हैं (उदा। एक संवाद विंडो में QTreeView के साथ, और दूसरे में QComboBox के साथ)। – abbot

2

यहाँ कैसे क्यूटी वास्तुकला एक आवेदन

http://doc.qt.io/qt-5/model-view-programming.html

क्यूटी, देखें और नियंत्रक में जोड़ दिया जाता है के लिए मॉडल-दृश्य डिजाइन प्रदान करता है पर सरकारी और विस्तृत मार्गदर्शिका का लिंक है, इसलिए एप्लिकेशन का उपयोग कर बनाया जा सकता है मॉडल-व्यू फ्रेमवर्क।

मॉडल डेटा के स्रोत के साथ संचार करता है, आर्किटेक्चर के अन्य घटकों के लिए इंटरफेस प्रदान करता है। संचार की प्रकृति डेटा स्रोत के प्रकार, और जिस तरह से मॉडल कार्यान्वित किया जाता है पर निर्भर करता है। दृश्य मॉडल से मॉडल इंडेक्स प्राप्त करता है; ये डेटा के आइटम के संदर्भ हैं। मॉडल इंडेक्स को मॉडल पर आपूर्ति करके, दृश्य डेटा स्रोत से डेटा की वस्तुओं को पुनर्प्राप्त कर सकता है। मानक विचारों में, एक प्रतिनिधि डेटा के आइटम प्रस्तुत करता है। जब एक आइटम संपादित किया जाता है, प्रतिनिधि मॉडल सीधे मॉडल अनुक्रमणिका का उपयोग कर के साथ संचार।

...

मॉडल, दृश्य और प्रतिनिधियों, संकेतों और स्लॉट

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