2010-01-12 17 views
14

मैं क्यूटी के लिए नया हूं। मैं समझता हूं कि आप डिस्प्ले रीफ्रेश को मजबूर कर सकते हैं, लेकिन मैंने यह पता लगाने की कोशिश कर अपने सभी बालों को खींच लिया है। यहां मैं विशेष रूप से करने की कोशिश कर रहा हूं।क्यूटी रिपेंट/रेड्रा/अपडेट/कुछ करें

मैं एक बटन (ऑनक्लिक सिग्नल इवेंट) दबाता हूं, जो डिस्प्ले पर एक छवि (QLabel) को बदलता है, इनपुट के लिए इंतजार करता है, और फिर एक नई छवि (अलग QLabel) को बदलकर आगे बढ़ता है। मैंने सब कुछ करने की कोशिश की है और ऑनक्लिक सिग्नल इवेंट कोड पूरा होने तक डिस्प्ले रीफ्रेश नहीं होता है। अभी, मैं उपयोगकर्ता इनपुट की प्रतीक्षा नहीं कर रहा हूं, मैं परीक्षण प्रयोजनों के लिए नींद (~ 500 एमएस) का उपयोग कर रहा हूं।

मैं क्या पढ़ा से, क्यूटी कार्यक्रम चालित अर्थ है कि मैं मूल रूप से घटनाओं, कि एक कुए में डाल करने के लिए, और मार डाला का एक समूह बना रहा हूं जब (onClick संकेत घटना) (मुख्य लूप) रिटर्न/(है आयोजन प्रबंधकर्ता)। मैं काम पूरा होने तक इंतजार नहीं करना चाहता, यह प्रोग्रामिंग को बेहद दर्दनाक बनाने जा रहा है अगर मुझे पूरी तरह से घटनाओं के आधार पर इस दिनचर्या को पूरा करना है।

मैं कैसे ताज़ा करने के लिए QLabel पिक्समैप मजबूर कर सकते हैं। मैंने सब कुछ करने की कोशिश की है। नीचे मेरे द्वारा क्लिक किए गए सभी कोड हैं जो मैंने ऑनक्लिक सिग्नल इवेंट हैंडलर में किया है।

update(); 
repaint(); 
ui->upButton->setUpdatesEnabled(TRUE); 
update(); 
repaint(); 
QPaintEvent paintevent(ui->upButton->childrenRegion()); 
QPaintEvent * test = &paintevent; 
paintEvent(test); 
this->changeEvent(test); 
ui->upButton->update(); 
ui->upButton->repaint(); 
ui->upButton->repaint(ui->upButton->childrenRegion()); 
repaint(); 
QApplication::sendPostedEvents(); 
this->parentWidget()->update(); 
usleep(100000); 

आप देख सकते हैं, मैं सिर्फ अंधेरे में इस बिंदु पर शूटिंग कर रहा हूँ (upButton QLabel के नाम जो एक पिक्समैप है)। मैंने नमूना कोड देखने और अपना पूरा होमवर्क करने की कोशिश की है, लेकिन मैं खो गया हूं। किसी भी मदद, सलाह, और नमूना कोड की सराहना करें।

+2

ईवेंट संचालित जीयूआई सिस्टम में, आप आमतौर पर अपने कॉलबैक में "इनपुट के लिए प्रतीक्षा" नहीं करते हैं। इनपुट के इंतजार की स्थिति का मतलब है कि आप इवेंट लूप में हैं। इसलिए मैं उलझन में हूं कि आप किसी भी चीज के लिए नींद का उपयोग क्यों करेंगे - जब आप * उपयोगकर्ता इनपुट के साथ सौदा करने जा रहे थे तो आप कॉलिंग के बारे में क्या सोच रहे थे? घटनाओं के बारे में चिंता न करें दर्दनाक ... सिग्नल और स्लॉट काटने (आमतौर पर) नहीं। – HostileFork

उत्तर

7

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

19
मैं नींद उपयोग कर रहा था कुछ देर राशि कंप्यूटर कुछ होने की प्रतीक्षा कर रहा था का अनुकरण करने

जैसा कि मैंने मेरे सवाल में कहा गया है, मैं नहीं की घटनाओं का उपयोग करने के क्योंकि यह अनावश्यक काम का एक बहुत अत्यंत बस कुछ पूरा करने के लिए है चाहता था।

इसके अलावा, 'घटना' जारी रखने के लिए कार्यक्रम के लिए जगह लेने के लिए की जरूरत है, एक यूएसबी घटना है। चूंकि मैं एक छिपाई वर्ग डिवाइस का उपयोग कर रहा हूं, इसलिए प्रतीक्षा लूप के बिना ईवेंट को सेट करने का कोई तरीका नहीं है। यूएसबी छिपाई कक्षाएं इंटरप्ट को सेट करने की अनुमति नहीं देती हैं, ओएस डिवाइस का दावा करता है।

मैं काम करने के लिए ऊपर पाने में कामयाब रहे। मैं डीबगर के माध्यम से चला गया और देखा कि प्रदर्शन नींद समारोह से पहले ताज़ा हो जाएगा। कार्यक्रम को स्वतंत्र रूप से चलाना, मुझे समय के 1% ताज़ा प्रदर्शन के साथ यादृच्छिक परिणाम मिल गए। मैंने नींद समारोह से छुटकारा पा लिया, और देरी को अनुकरण करने के लिए इसके स्थान पर कुछ अन्य कोड जोड़ा, और यह ठीक था।

बस हर किसी के ज्ञान के लिए, यह संभव है, यह मना नहीं है, और यह निम्नलिखित के साथ क्या करना आसान है:

qApp->processEvents(); 

qApp QApplication शीर्षक में एक वैश्विक बाहरी चर रहा है।

क्योंकि यह यूएसबी घटना मेरा प्रवाह मुश्किल बना रही है, मैं QWaitCondition कक्षा पर ठोकर खाई। मैं यूएसबी घटना के लिए इंतजार कर रहा एक प्रक्रिया शुरू करने जा रहा था। मैं तब तक इंतजार करूंगा जब तक प्रक्रिया मेरे दिनचर्या के लिए प्रतीक्षा की स्थिति जारी न करे।

लेकिन अगर कोई सोचता है कि यह एक बुरा विचार है, तो कृपया बात करें। मैं वास्तव में आपकी प्रतिक्रिया PiedPiper और शत्रुतापूर्ण फोर्क की सराहना करता हूं।

धन्यवाद।

2

यदि मैं सही ढंग से समझ गया, तो आपके पास एक स्लॉट है और इस स्लॉट में, आप QLabel में दिखाए गए चित्र को अपडेट करते हैं। लेकिन आप स्लॉट खत्म होने से पहले यह परिवर्तन प्रदर्शित करना चाहते हैं।

यदि ऐसा है, तो एक अद्यतन() ईवेंट जारी करें, और qApp-> processEvents() को कॉल करें। यह विधि इवेंट कतार में प्रतीक्षा करने वाली घटनाओं को संसाधित करती है और फिर लौटाती है, इसलिए यह हो सकता है कि आप बाद में हों।

पीएस: एक अपडेट() बिल्कुल आवश्यक नहीं हो सकता है, मुझे यकीन नहीं है।

2

मैंने कभी-कभी देखा कि जब आपके पास कई स्तरित विजेट हैं, या विगेट्स के अंदर विजेट्स यह उनकी पेंट() घटनाओं को कॉल करने में मदद करता है।

उदाहरण

this->repaint(); 
this->parentWidget()->repaint(); 
this->parentWidget()->parentWidget()->repaint(); 

के लिए यह काफी आसान एक और धागा के लिए किसी भी प्रसंस्करण बाहर धकेलने, या अतिरिक्त ईवेंट हैंडलर्स बनाने तो है।