2012-08-03 20 views
9

मुझे वर्तमान में एक परियोजना के लिए जीयूआई लाइब्रेरी की आवश्यकता है। मैं अजगर से परिचित हूं और पाया कि पीईक्यूटी एक अच्छा विकल्प हो सकता है।एक पीईक्यूटी उदाहरण प्रोग्राम के बारे में

मैं a tutorial about PyQt पढ़ रहा हूँ, और काफी उलझन में निम्नलिखित example program

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

""" 
ZetCode PyQt4 tutorial 

In this example, we draw text in Russian azbuka. 

author: Jan Bodnar 
website: zetcode.com 
last edited: September 2011 
""" 

import sys 
from PyQt4 import QtGui, QtCore 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):  

     self.text = u'\u041b\u0435\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\ 
\u0435\u0432\u0438\u0447 \u0422\u043e\u043b\u0441\u0442\u043e\u0439: \n\ 
\u0410\u043d\u043d\u0430 \u041a\u0430\u0440\u0435\u043d\u0438\u043d\u0430' 

     self.setGeometry(300, 300, 280, 170) 
     self.setWindowTitle('Draw text') 
     self.show() 

    def paintEvent(self, event): 

     qp = QtGui.QPainter() 
     qp.begin(self) 
     self.drawText(event, qp) 
     qp.end() 

    def drawText(self, event, qp): 

     qp.setPen(QtGui.QColor(168, 34, 3)) 
     qp.setFont(QtGui.QFont('Decorative', 10)) 
     qp.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)   


def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

यहाँ के बारे में, मुख्य कार्य में, एक उदाहरण वस्तु बन जाता है, इस प्रकार __init__() समारोह, initUI() कहा जाता है। मेरा प्रश्न है जहां paintEvent() फ़ंक्शन कहा जाता है ?? चूंकि हम प्रोग्राम चलाते हैं, self.text(some Russian letters) विजेट पर बिल्कुल दिखाई देगा।

दूसरे शब्दों में, sys.exit(app.exec_()) वास्तव में क्या करता है? यह paintEvent() फ़ंक्शन क्यों कॉल करेगा?

धन्यवाद!

उत्तर

6

PyQt docs से:

int QApplication.exec_()

मुख्य समारोह पाश और प्रतीक्षा करता है exit() जब तक प्रवेश कहा जाता है, तो मूल्य कि exit() स्थापित किया गया था (जो 0 exit() अगर के माध्यम से कहा जाता है देता है quit())।

इवेंट हैंडलिंग शुरू करने के लिए इस फ़ंक्शन को कॉल करना आवश्यक है। मुख्य ईवेंट लूप विंडो सिस्टम से ईवेंट प्राप्त करता है और इन्हें एप्लिकेशन विजेट पर प्रेषित करता है।

another source से:

sys.exit(app.exec_())

अंत में, हम आवेदन की mainloop दर्ज करें। इवेंट हैंडलिंग इस बिंदु से शुरू होती है। मेनलोप विंडो सिस्टम से ईवेंट प्राप्त करता है और उन्हें एप्लिकेशन विजेट पर भेजता है। मेनलोप समाप्त होता है, अगर हम exit() विधि पर कॉल करते हैं या मुख्य विजेट नष्ट हो जाता है। sys.exit() विधि एक साफ़ निकास सुनिश्चित करता है। पर्यावरण को सूचित किया जाएगा, आवेदन कैसे समाप्त हुआ।

exec_() विधि में अंडरस्कोर है। ऐसा इसलिए है क्योंकि exec एक पायथन कीवर्ड है। और इस प्रकार, exec_() इसके बजाए उपयोग किया गया था।

बारे painting:

4.2.1। जब चित्रकारी होता है

paintEvent() प्रक्रिया स्वतः ही कहा जाता है जब

  • आपका विजेट पहली बार के लिए दिखाया गया है।

  • विजेट के कुछ भाग (या सभी) को प्रकट करने के लिए एक विंडो को स्थानांतरित करने के बाद स्थानांतरित किया गया है।

  • खिड़की जिसमें विजेट झूठ कम होने के बाद बहाल किया जाता है।

  • जिस विंडो में विजेट झूठ है उसका आकार बदल गया है।

  • उपयोगकर्ता दूसरे डेस्कटॉप से ​​डेस्कटॉप पर स्विच करता है जिस पर विजेट की विंडो झूठ बोलती है।

आप रंग घटनाओं मैन्युअल QWidget::update() फोन करके उत्पन्न कर सकते हैं। QWidget::update() पेंट ईवेंट उत्पन्न करने से पहले विजेट मिटा देता है। आप update() पर तर्क पारित कर सकते हैं, जो चित्रों को केवल पर क्षेत्रों (आयताकारों, विशेष रूप से) पर प्रतिबंधित कर सकते हैं, जिनकी आवश्यकता है। विधि के दो समतुल्य रूप QWidget::update (int x, int y, int width, int height) और QWidget::update (QRect rectangle) हैं, जहां x और y आयत के ऊपरी-बाएं कोने देते हैं, और चौड़ाई और ऊंचाई स्पष्ट हैं। क्योंकि update() इवेंट कतार में एक पेंट इवेंट रखता है, पेंटिंग तब तक होती है जब तक कि वर्तमान विधि बाहर निकलती है और इवेंट हैंडलर पर रिटर्न नियंत्रित करती है। यह एक अच्छी बात है क्योंकि अन्य घटनाएं संसाधित होने की प्रतीक्षा कर रही हैं, और जीयूआई को आसानी से संचालित करने के लिए समय पर घटनाओं को संसाधित करने की आवश्यकता है।

तुम भी QWidget::repaint (int x, int y, int width, int height, bool erase) (या में से एक कई सुविधा-विधि रूपों), जहां सभी तर्कों update() विधि के मामले में एक ही मतलब फोन करके विजेट की पेंटिंग आह्वान कर सकते हैं, और मिटा करने के लिए है कि क्या फिर से रंगना बताता है इसे पेंट करने से पहले आयताकार मिटा दें। repaint() कॉल paintEvent() सीधे। यह इवेंट कतार में एक पेंट इवेंट नहीं रखता है, इसलिए देखभाल के साथ इस विधि को का उपयोग करें। आप एक एनीमेशन बनाने के लिए, उदाहरण के लिए, एनीमेशन तैयार किया जाएगा एक सरल पाश से बार-बार repaint() कॉल करने के लिए कोशिश करते हैं लेकिन क्योंकि घटनाओं माउस बटन क्लिक, कुंजीपटल प्रेस करने के लिए इसी अपने यूजर इंटरफेस के बाकी अनुत्तरदायी हो जाएगा , और इसी तरह कतार में इंतजार कर रहे हैं। यहां तक ​​कि यदि आप एनीमेशन के रूप में संभावित रूप से समय लेने वाली कार्य के रूप में कार्य नहीं कर रहे हैं, तो यह आमतौर पर update() का उपयोग करने के लिए बेहतर है ताकि आपकी जीयूआई जिंदा रह सके।

आप paintEvent() बाहर अपने विजेट पर कुछ रंग हैं, तो आप अभी भी तर्क शामिल करने के लिए और की जरूरत है paintEvent() में है कि एक ही बात पेंट करने के लिए आवश्यक आदेश देता है। अन्यथा, आपके द्वारा किए गए चित्र अगली बार विजेट अपडेट होने पर गायब हो जाएंगे।

+0

इस तरह के विस्तृत स्पष्टीकरण के लिए धन्यवाद। – Junjie

1

app.exec_() क्यूटी मुख्य पाश शुरू करता है, जो तब समाप्त होता है जब प्रत्येक निर्मित विजेट नष्ट हो जाता है (उदा। इसकी विंडो बंद करके)। paintEvent फ़ंक्शन एक तरीका है जिसे आप QWidget उपclass से दिए गए Example वर्ग से अधिभारित कर सकते हैं, जिसे क्यूटी प्रदर्शित करता है, अद्यतन करता है या विजेट को प्रतिबिंबित करता है।

आप इन चीजों को Qt documentation या PyQt Documentation में देख सकते हैं (जो कि ज्यादातर एक अलग प्रारूप में क्यूटी दस्तावेज़ीकरण की एक प्रति है, लेकिन कभी-कभी पीईक्यूटी-विशिष्ट चीजों के बारे में कुछ मूल्यवान जानकारी होती है)।

1

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

पीईक्यूटी में, हम अनिवार्य रूप से दो तरीकों से घटनाओं से निपट रहे हैं। हम स्लॉट्स या सिग्नलमेंट इवेंट हैंडलर को सिग्नल कनेक्ट करते हैं (एक इवेंट हैंडलर स्लॉट के लिए समानार्थी है)। प्रदत्त उदाहरण QtGui.QWidget से विरासत में मिला है जिसमें पहले से ही कुछ पेंटिंग कोड उपलब्ध हैं। हमारी कस्टम पेंटिंग करने के लिए, हमें मौजूदा paintEvent() ईवेंट हैंडलर को पुन: कार्यान्वित करना होगा। स्थिति के आधार पर, हम माता-पिता की paintEvent() विधि को कॉल कर सकते हैं या नहीं।

sys.exit(app.exec_())paintEvent() विधि को कॉल नहीं करता है। exec_() विधि एक ईवेंट लूप शुरू करता है। घटना पाश घटनाओं को पकड़ता है और भेजता है। पेंट घटनाएं उपयोगकर्ताओं या ऑपरेटिंग सिस्टम द्वारा ट्रिगर की जाती हैं। उदाहरण के लिए, जब हम उदाहरण लॉन्च करते हैं, तो पेंट इवेंट दो बार ट्रिगर होता है। (इवेंट हैंडलर में print "Event occurred" लाइन डालें ताकि यह देखने के लिए कि इस विधि को कितनी बार बुलाया जाता है।) खिड़कियों का आकार बदलना, खोना या फोकस करना, खिड़कियों को कम करना या अधिकतम करना, इन सभी कारणों से चित्रकला घटनाओं को ट्रिगर किया जाना चाहिए।

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