2012-09-13 9 views
20

दर्ज करने से पहले QT GUI को अद्यतन करने के लिए मजबूर करना ऐसा लगता है कि यह स्वचालित होना चाहिए, लेकिन स्पष्ट रूप से यह नहीं है। मैं निम्नलिखित कोड है: "। समाप्त"एक अलग फ़ंक्शन

ui.my_label->setText("Test 1..."); 
    ui.my_label->adjustSize(); 

    processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

    ui.my_label->setText("Finished."); 
    ui.my_label->adjustSize(); 

क्या हो रहा है कि मैं कभी नहीं "Test1...", देख के रूप में जीयूआई जब तक निम्नलिखित समारोह पूरा करता है लटका करने लगता है, और मैं eventaully केवल देखते हैं।

मैं यह सुनिश्चित कैसे कर सकता हूं कि GUI उस फ़ंक्शन में प्रवेश करने से पहले अपडेट हो रहा है?
धन्यवाद।

+2

क्या आपने 'repaint()' या 'update()' जैसी कुछ कोशिश की है? – Derek

उत्तर

24

यदि आप अपने कोड दर्ज करने से पहले ईवेंट कतार को संसाधित करने में सक्षम हो जाते हैं;

#include <QApplication> 

और, यदि आप अपने GUI ताज़ा करने के लिए चाहते हैं, कहते हैं;

qApp->processEvents(); 

नोट यह आपके लंबी चलने वाली प्रक्रिया कॉल कि अब और फिर कार्य करते है, अपने जीयूआई अधिक उत्तरदायी महसूस करने के लिए जाने के लिए एक अच्छा विचार हो सकता है।

+2

यह निश्चित रूप से काम करेगा, हालांकि मैं आमतौर पर 'प्रक्रिया एवेन्ट्स' पर कॉल के खिलाफ सलाह देने का प्रयास करता हूं, क्योंकि यदि आपका कोड पुनर्वित्त नहीं है तो यह बहुत अप्रत्याशित समस्याएं पैदा कर सकता है। – Chris

14

यदि आप इस समय के दौरान अपने जीयूआई को उत्तरदायी होने की परवाह नहीं करते हैं, तो my_label->repaint() पर एक कॉल चाल चलती है। क्यूटी आपके लिए स्वचालित रूप से कुछ भी नहीं कर सकती है जब तक कि आप ईवेंट लूप पर न आएं।

अधिकतम प्रतिक्रिया के लिए आप अपनी प्रक्रिया को एक अलग थ्रेड में चलाने पर विचार कर सकते हैं और सिग्नल/स्लॉट कनेक्शन (जो डिफ़ॉल्ट रूप से थ्रेड-सुरक्षित हैं) का उपयोग कर सकते हैं ताकि आपकी प्रसंस्करण पूर्ण हो जाने पर आपके मुख्य जीयूआई थ्रेड को सिग्नल किया जा सके।

3

मैं सिर्फ यह जोड़ना चाहता था कि मेरे लिए यह दो उत्तरों का एक कॉम्बो लिया जो मैंने देखा था। तो मेरे लिए क्या काम किया गया था:

ui.my_label->setText("Test 1..."); 
ui.my_label->adjustSize(); 

//! Both of these lines needed 
ui.my_label->repaint(); 
qApp->processEvents(); 

processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

ui.my_label->setText("Finished."); 
ui.my_label->adjustSize(); 

उम्मीद है कि यह किसी की मदद करेगा।

+0

'self.repaint() '' self.progress.setVisible (गलत) के बाद मेरे मामले में काम करता है – Winand

+0

हू, मेरे लिए भी यही है। मुझे दोनों काम करने की जरूरत थी। आपको लगता है कि 'processEvents' स्वचालित रूप से सब कुछ पेंट कर देगा। –

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