user interface ययन जीयूआई में घटना चक्र को तोड़ने




घटनाचक्र पूर्वावलोकन pdf (3)

इस से निपटने का मानक क्यूटी तरीका है और यह भी कि उनके बहुत ही उपयोगी ट्यूटोरियल में सुझाव दिया गया है कि नियंत्रक में मान में परिवर्तन करना है, यदि नया मान वर्तमान मूल्य से अलग है।
इस तरह से संकेतों के मूल्य के शब्दों को valueChanged()

इस ट्यूटोरियल को देखें

जीयूआई लिखते समय, मुझे अक्सर निम्न समस्या आती है: मान लें कि आपके पास एक मॉडल और नियंत्रक है। नियंत्रक के पास एक विजेट W जो मॉडल के प्रॉपर्टी X को दिखाने के लिए उपयोग किया जाता है।

क्योंकि मॉडल को नियंत्रक के बाहर से बदला जा सकता है (नियंत्रक एक ही मॉडल का उपयोग कर रहे अन्य नियंत्रक हो सकते हैं, पूर्ववत कार्यों आदि), नियंत्रक मॉडल पर होने वाले बदलावों को सुनता है। नियंत्रक विजेट की घटनाओं को भी सुनता है और संपत्ति X तदनुसार अद्यतन करता है।

अब, निम्न होता है:

  1. W में मान बदल जाता है
  2. एक इवेंट उत्पन्न होता है, नियंत्रक में हैंडलर लागू होता है
  3. नियंत्रक मॉडल में X लिए नया मान सेट करता है
  4. मॉडल घटनाओं का उत्सर्जन करता है क्योंकि यह बदल गया है
  5. नियंत्रक मॉडल से एक परिवर्तन घटना प्राप्त करता है
  6. नियंत्रक को X का मान मिलता है और इसे विजेट में सेट करता है
  7. गोटो 1

इसके लिए कई संभावित समाधान हैं:

  1. जब मॉडल को अपडेट किया जाता है, तो ध्वज सेट करने के लिए नियंत्रक को संशोधित करें, और यदि इस ध्वज को सेट किया गया है, तो मॉडल से किसी भी ईवेंट पर प्रतिक्रिया न करें।
  2. नियंत्रक को अस्थायी रूप से डिस्कनेक्ट करें (या मॉडल को कुछ समय के लिए किसी भी घटना को न भेजने के लिए कहें)
  3. विजेट से अपडेट अपडेट करें

अतीत में, मैं आमतौर पर 1 विकल्प के लिए गया था। क्योंकि यह सरलतम चीज है झंडे के साथ अपनी कक्षाओं को अव्यवस्थित करने में इसकी कमी है, लेकिन अन्य विधियों में भी उनकी कमियां हैं।

बस रिकॉर्ड के लिए, मुझे जीटीके +, क्यूटी और एसडब्ल्यूटी सहित कई जीयूआई टूलकिट्स के साथ इस समस्या थी, इसलिए मुझे लगता है कि यह बहुत टूलकिट-अज्ञेयवादी है

कोई सर्वोत्तम अभ्यास? या वास्तुकला क्या मैं बस गलत इस्तेमाल करता हूँ?

@ शॉ: यह कुछ मामलों का समाधान है, लेकिन यदि आप X को नियंत्रक के बाहर से बदल दिया गया है (उदाहरण के लिए, पूर्ववत / पुन: के लिए कमांड पैटर्न का उपयोग करते समय), तब भी आप अनावश्यक घटनाओं का एक दौर प्राप्त करते हैं, क्योंकि तब मान बदल गया है, W एक इवेंट को अद्यतित और आग लगा दिया है मॉडल को किसी दूसरे (बेकार) अद्यतन को रोकने के लिए, विजेट द्वारा उत्पन्न होने वाली घटना को निगल जाना होगा।
अन्य मामलों में, यह मॉडल अधिक जटिल हो सकता है और संभवतः संभवतः संभवतः परिवर्तित नहीं हो सकता है, इस पर एक साधारण जांच होनी चाहिए, जैसे कि जटिल पेड़ दृश्य


आम तौर पर आपको विजेट में इनपुट इवेंट्स का जवाब देना चाहिए और ईवेंट को परिवर्तित नहीं करना चाहिए। यह इस प्रकार के लूप को घटने से रोकता है।

  1. उपयोगकर्ता विजेट में इनपुट को परिवर्तित करता है
  2. विजेट परिवर्तन घटना का उत्सर्जन करता है (स्क्रॉल किया गया / क्लिक किया गया / माउस छोड़ दिया, आदि)
  3. नियंत्रक प्रतिक्रिया देता है, मॉडल में बदलने के लिए अनुवाद करता है
  4. मॉडल घटना का उत्सर्जन करता है
  5. नियंत्रक प्रतिक्रिया देता है, विजेट में मान बदलता है
  6. मूल्य परिवर्तन घटना उत्सर्जित, लेकिन नियंत्रक द्वारा नहीं सुनी

काम को अद्यतन करने का संकेत देने के लिए ध्वज। आप उन्हें अपग्रेड और एंडअपडेट जैसे तरीकों में लपेट सकते हैं।







events