記錄QT學習過程中的一個區域刷新出現殘影的問題

記錄QT學習過程中的一個區域刷新出現殘影的問題

首先感謝@飛揚青雲 大佬的源代碼,讓我在學習QT的時候有了大量的練習項目

問題描述

在大佬的gitee庫中,有個叫movewidget的小項目,利用eventfilter註冊的方式爲控件添加了可拖拽移動的屬性,但本人在利用這個特性實現控件拖拽的時候就出問題了,就像這樣:

在這裏插入圖片描述

圖一

本來想做出兩個網絡節點連接,其間的連接鏈路實時跟隨節點位置改變的效果,但是節點拖動的時候就出現鏈路刷新的問題了,如果拖拽節點圍繞另一個節點繞一個圈,會發現是這樣的:
在這裏插入圖片描述

圖二
可以看到連接鏈路的角度其實一直都在變,而且方向大致是對的,說明鏈路也確實一直在刷新,但是畫布上的鏈路一直都不刷新,而且還會拖拽出一些點點點....只要停止拖拽,鏈路馬上變得筆直筆直,多餘的點點點也不見了,一切恢復正常,就彷彿這個拖拽過程什麼都沒發生一樣。

實現原理

畫布

ES1和SW1均爲節點控件(QWidget),在這個小程序中,我將ES1 和SW1兩個控件扔進了一個widget中,這個widget稱之爲節點畫布(後續打算在這個上面生成多個類似ES1和SW1的類型爲QWidget的節點)

鏈路

可以看到,鏈路的實現其實很簡單,就是保存鏈路的起點和終點,並且重寫畫布的paintEvent()函數,達到在每次畫面改變時重新繪製表示鏈路的線段的目的。節點控件的move()方法也被重寫了,每次移動的時候均會刷新鏈路的起點和終點,並將節點控件置爲最頂層,這樣就可以實現節點移動時表示鏈路的線段兩端也隨之移動

在這裏插入圖片描述

圖三
理論上拖拽節點的效果也應該如上圖所示,現在只能做到在連接時鼠標相關的鏈路不會出現問題,一旦將之和節點控件綁定在一起,就出現了圖1和圖2的bug。

調試

解決思路

根據經驗,猜測是節點控件在移動時,其父控件(即畫布,也是一個QWidget)的刷新動作被停止了,針對這種情況,我可以在子控件(ES1和SW1)的move()方法中添加了其父控件主動刷新的動作
在這裏插入圖片描述
查詢幫助文檔可知,主動刷新某個控件的方法有兩個:update()repaint(),其中update()比較安全和迅速,不會導入無限遞歸的情況,但是其主動刷新的動作不一定實時,update可能在paintEvent方法中被調用時陷入到一個無限遞歸的情況中去,但是在這裏由子控件的move方法調用,不會產生這種問題。

解決結果

嘗試了update()repaint()方法,最後的結果是一樣的。。。。。。。繼續去找資料嘗試解決中,難受ing

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章