Qt界面——閃爍

一、使用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()若干時間後無法自動重繪界面的問題     解決辦法都是在主線程刷新。

發佈了54 篇原創文章 · 獲贊 19 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章