看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Arim (Arim5566)》之銘言:
Serge45:需要立即重畫就用 repaint,update我用起來像是累積一定 10/25 18:32
Serge45:的量才會呼叫 paintEvent 10/25 18:33
: 謝謝,看了官方的doc也是說執行一次update相當於執行好幾次的repaint : 所以目前我比較不清楚的地方在於什麼時候該用update,什麼時候該用repaint@@ 其實 update 的實作很簡單 void QWidget::update(const QRect &rect) { if (isInPaintEvent()) postEventToUpdateLater(); else repaint(rect); } 真的大概就這樣而已 除非這個 update 呼叫是在 pain event 的途中被呼叫, 否則就等於 repaint 這也就是說 當你有 nested update 的時候, 後面的 update 會被排到 main queue 的後面 等到大部份其他東西處理完之後, 才會來處理這些多的 update 呼叫 另一方面 repaint 則是不論如何都會立刻處理 使用時機的話, 基本上大多數的情況你都應該用 update 因為如果 main queue 裡面還有很多東西 基本上即使你畫了使用者也看不到, 因為電腦也沒空把它放到螢幕上 使用 repaint 的唯一合理狀況是當你必須現在就呼叫 paintEvent 不過我個人不認為這是個好的設計模式 -- ╱ ̄ ̄ ̄╲ ▏◢█◣ 成龍表示: 是喔... ′/ ‵ ╰╯ ψQSWEET █◤ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146
Arim:thanks! 10/25 23:34
Arim:意思是說我呼叫update()的時候剛好paintevent還沒做完嗎? 10/25 23:41
Arim:所以就把update()的動作放到queue,然後執行後面的t=t+1? 10/25 23:41
Arim:然後之後update所要paint的東西從queue中拿出來,這時候用到的 10/25 23:47
Arim:t已經改變了,所以才會造成不是預期的情況 10/25 23:47
大致上就是這樣沒錯, 實際還要看 OS 的運作 因為 buffering 的關係 不見得你(或者說你藉由 Qt)叫 OS 畫圖它就會馬上畫到螢幕上 所以即使是 repaint 也不是「現在就顯示」 只是以 OS 的角度而言「盡快」
legnaleurc:pain event ... 是有多痛? XD 10/25 23:49
大概這麼痛吧 QQ http://forum.gamer.com.tw/C.php?page=1&bsn=07697&snA=1865
Serge45:長知識了...m(_ _)m 10/26 00:50
※ 編輯: uranusjr 來自: 210.68.71.125 (10/26 13:44)