一、使用setUpdateEnabled
二、在主線程中刷新
場景一:一個scroll窗口裏面有很多preview窗口,preview窗口在播放內容。拖動scroll滑動塊的時候,preview播放內容發生閃爍。
解決辦法:
嘗試了用本身的Scroll方法,以及用QScrollArea來代替都沒有取得很好的成果。主要記錄如下:
a..在窗口總高度沒有超過可視高度時,無論使不使用QScrollArea都不會閃爍(沒有滑動,長度不夠)。
b. update()和repaint調用的paintEvent中的確有可能造成閃爍,但是在這裏,paintEvent幾乎沒有做什麼操作,
屏蔽了裏面的操作也還是沒有解決問題。
c. 不論是使用QScrollArea還是不使用,把畫布高度調成sumheight,甚至比sumheight還高的情況下還是會閃爍。
d. 在preview窗口中自己繪製了彩條,在滑動滾動條的時候不會閃爍。
e. 把preview的背景色設置爲透明還是閃爍。且將AutoFillBackgound屬性設爲false還是閃爍。
最後給出的建議是強制不刷新,setUpdateEnabled,然後經過適當的處理之後,現在滿
足需求,沒有閃爍了。應該是scroll的時候Qt內部會進行重繪,不僅僅是代碼中自己
寫的paintEvent,而是系統自己的背景處理。
場景二:研究preview窗口時碼停止刷新的問題。
做了以下方面測試:a. 在下方菜單欄中放兩個label,讓其同樣進行時碼刷新。並且打日誌記錄通道窗口接受到的時碼信息。結果是
一直都在接收數據,菜單欄的label也在刷新,只是通道窗口的時碼不刷新。 b.爲了避免是通道窗口的其他設置造成的,暫時屏蔽通道窗口外面的框框、標題欄過長的判斷、
preview窗口進制刷新判斷這幾點,依然是會停止刷新。 c.測試是不是通道窗口本身的結構問題,就不從底層接受時碼,其他操作都不做,就用一個定時器不斷髮時間讓他
刷新,也會出現時碼不刷新,只有在切換窗口或點擊其他父窗口時纔會刷新一次。網上找了一些類似現象的解決方案,包括重寫showEvent以及增加repaint都不能解決這個問題。
最終將刷新線程放到主線程,時碼刷新纔不會停掉。
這個問題主要是我在一個子線程裏面一直接受數據,生成時碼,調用控件的setText來更新界面。這裏面沒有update,但是我估計setText這個函數裏面應該也是調用了update來刷新的。放在主線程裏面的刷新,我採用的方法主要是在子線程裏面發送一個信號出來,在主線程裏面接收這個信號,並在主線程的槽函數裏面進行setText刷新時碼。
我這個問題和這個博文裏面很像:頻繁調用update()若干時間後無法自動重繪界面的問題 解決辦法都是在主線程刷新。