पहले आप यह कर सकते में से एक क्यूटी 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, 'सीधी पहुँच द्वारा निर्धारित नहीं है का उपयोग करते हुए एक दूसरे से संवाद के लिए अपने नियंत्रक shouldn ' टी गहराई प्राप्त नहीं करें: 'self._title = शीर्षक की संभावना का उल्लेख क्यों न करें; self._year = साल; ... '? – mlvljr
मैन्युअल रूप से आपके दृश्य को संपादित करने का कारण यह आपके मॉडल और नियंत्रण से अलग नहीं होगा? – Kemeia
यह इसका कारण नहीं है, लेकिन ऐसा नहीं कर रहा है ** ** इसे रोकता है – cmaynard