2009-11-13 18 views
5

मैं जानना चाहता हूं कि जब मैं QWidget की अद्यतन() विधि को कॉल करता हूं तो वास्तव में क्या होता है।
यहाँ प्रलेखन है:बाद में क्यूटी विजेट अपडेट लेकिन कब?

http://doc.qt.digia.com/4.5/qwidget.html#update

यह फ़ंक्शन एक तत्काल रीपेंट कारण नहीं है; इसके बजाय को प्रोसेस करने के लिए शेड्यूल करता है जब क्यूटी मुख्य ईवेंट लूप पर लौटता है। यह क्यूटी को के लिए कॉल से पुन:() करने के लिए कॉल करने के लिए अधिक गति और कम झिलमिलाहट के लिए ऑप्टिमाइज़ करने की अनुमति देता है।

मुझे लगता है कि एक QUpdateLaterEvent बनाया है और प्रकार के साथ पोस्ट QEvent :: UpdateLater

प्रलेखन के इस हिस्से में है क्यूटी स्रोत कोड से देख http://doc.qt.digia.com/4.5/qevent.html

QEvent :: UpdateLater : विजेट को बाद में पर पुनर्निर्मित करने के लिए कतारबद्ध किया जाना चाहिए।

'बाद के समय' का क्या अर्थ है?
क्या मेरे सभी उत्सर्जित कतारबद्ध सिग्नल और पेंट से पहले संसाधित कतार में घटनाएं हैं?

धन्यवाद,
गेबर

+1

आप यह सुनिश्चित करने के लिए "QWidget :: repaint()" विधि का उपयोग कर सकते हैं कि आपका विजेट पुन: चित्रित किया जाएगा। या यह आपके लिए विकल्प नहीं है? – cybevnm

+0

नहीं, यह एक विकल्प नहीं है। मैं अन्य धागे में कतारबद्ध सिग्नल उत्सर्जित करता हूं जो विजेट अपडेट का परिणाम देता है।मैं एक-दूसरे के बाद एक से अधिक ऐसे सिग्नल उत्सर्जित करता हूं और मैं यह सुनिश्चित करना चाहता हूं कि कतारबद्ध सिग्नल अपडेट से पहले संसाधित हो जाएं और कई बार अपडेट न करें। – Vereb

उत्तर

4

की जाँच के बाद QWidget :: अद्यतन() स्रोत कोड मैंने पाया यह इस पद्धति src/gui/kernel/qwidget.cpp:9544 में कॉल:

void QWidget::update(const QRect &rect) 
{ 
    if (!isVisible() || !updatesEnabled() || rect.isEmpty()) 
     return; 

    if (testAttribute(Qt::WA_WState_InPaintEvent)) { 
     QApplication::postEvent(this, new QUpdateLaterEvent(rect)); 
     return; 
    } 

    if (hasBackingStoreSupport()) { 
     QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); 
     if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) 
      tlwExtra->backingStore->markDirty(rect, this); 
    } else { 
     d_func()->repaint_sys(rect); 
    } 
} 

आप QUpdateLaterEvent देख सकते हैं केवल पोस्ट किया जाता है अगर अद्यतन() को पहले से ही paintEvent() विधि के अंदर से बुलाया जाता है।

आप लाइन 9456 पर QWidget::repaint(const QRect &rect) स्रोत भी देख सकते हैं - इसमें testAttribute(Qt::WA_WState_InPaintEvent) चेक की कमी है।

संपादित

QUpdateLaterEvent, एक Qt::NormalEventPriority घटना के रूप में पोस्ट किया जाता है तो यह अन्य सभी सामान्य प्राथमिकता घटनाओं के बाद संसाधित किया जाता है (src/corelib/kernel/qcoreapplication.cpp:971 और :1003 देखें)। आप compressEvent कोड को भी देखना चाहते हैं, मैंने इसे चेक नहीं किया है।

तो अंततः प्रश्न का उत्तर देने के लिए: QUpdateLaterEvent को अन्य उच्च और सामान्य प्राथमिकता घटनाओं के बाद संसाधित किया जाता है जो पोस्ट किए जाने से पहले कतार में थे।

+0

धन्यवाद, लेकिन मैंने पहले इस समारोह को देखा है। लेकिन मैं जानना चाहता हूं कि पोस्ट की गई घटना के साथ क्या होता है। घटना की प्राथमिकता क्या है? इस घटना के पहले/बाद में अन्य घटनाओं को संसाधित किया जाता है। – Vereb

+0

कतारबद्ध संकेतों के बारे में क्या है जो किसी अन्य धागे में मुख्य धागे में उत्सर्जित किए गए थे? घटनाओं से पहले संसाधित संकेत हैं? – Vereb

+0

दस्तावेज़ीकरण इस पर थोड़ा अस्पष्ट है: प्रेषक या रिसीवर के ईवेंट लूप पर सिग्नल कतारबद्ध होने पर इसे काफी नहीं कर सका। –

4

व्यवहार दस्तावेज नहीं है == क्यूटी संस्करणों के बीच रहने के लिए गारंटी नहीं है। आपको कोड नहीं लिखना चाहिए जो अन्य घटनाओं के सापेक्ष पेंट घटनाओं के क्रम पर निर्भर करता है।

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