记录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

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