记录QT学习过程中的一个区域刷新问题
首先感谢@飞扬青云 大佬的源代码,让我在学习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