首先感謝@飛揚青雲 大佬的源代碼,讓我在學習QT的時候有了大量的練習項目
問題描述
在大佬的gitee庫中,有個叫movewidget的小項目,利用eventfilter註冊的方式爲控件添加了可拖拽移動的屬性,但本人在利用這個特性實現控件拖拽的時候就出問題了,就像這樣:
本來想做出兩個網絡節點連接,其間的連接鏈路實時跟隨節點位置改變的效果,但是節點拖動的時候就出現鏈路刷新的問題了,如果拖拽節點圍繞另一個節點繞一個圈,會發現是這樣的:
實現原理
畫布
ES1和SW1均爲節點控件(QWidget),在這個小程序中,我將ES1 和SW1兩個控件扔進了一個widget中,這個widget稱之爲節點畫布(後續打算在這個上面生成多個類似ES1和SW1的類型爲QWidget的節點)
鏈路
可以看到,鏈路的實現其實很簡單,就是保存鏈路的起點和終點,並且重寫畫布的paintEvent()
函數,達到在每次畫面改變時重新繪製表示鏈路的線段的目的。節點控件的move()
方法也被重寫了,每次移動的時候均會刷新鏈路的起點和終點,並將節點控件置爲最頂層,這樣就可以實現節點移動時表示鏈路的線段兩端也隨之移動
調試
解決思路
根據經驗,猜測是節點控件在移動時,其父控件(即畫布,也是一個QWidget)的刷新動作被停止了,針對這種情況,我可以在子控件(ES1和SW1)的move()方法中添加了其父控件主動刷新的動作
查詢幫助文檔可知,主動刷新某個控件的方法有兩個:update()
和repaint()
,其中update()比較安全和迅速,不會導入無限遞歸的情況,但是其主動刷新的動作不一定實時,update可能在paintEvent方法中被調用時陷入到一個無限遞歸的情況中去,但是在這裏由子控件的move方法調用,不會產生這種問題。
解決結果
嘗試了update()
和repaint()
方法,最後的結果是一樣的。。。。。。。繼續去找資料嘗試解決中,難受ing