• 19216阅读
  • 15回复

[提问]QT5实现窗体半透明阴影,paintEvent()重绘底图有残留 [复制链接]

上一主题 下一主题
离线zhangjin512
 

只看楼主 倒序阅读 楼主  发表于: 2013-04-18
源码: GTest.rar (250 K) 下载次数:159


派生类class GStyleWidget : public QWidget
构造函数中设置窗体无边框,背景透明
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground,true);


重载void paintEvent(QPaintEvent *event),绘制窗体背景图片背景图片为一张带半透明阴影的圆角矩形PNG底图,主要利用九宫格的思想去实现的。
运行程序后,界面正常,如下:


能正常显示半透明阴影,可是如果切换几次窗口后,每次窗体重绘,都会残留上次绘制的底图,导致效果变成如下图:


阴影已经不再半透明了,而是不断不擦除地重绘造成的黑边框。


如果调整窗体的大小后,窗体效果又会变回正常(说明窗体大小发生改变时,重绘窗体又擦除原有的背景);


哪位大侠知道为什么吗?求解!!!(代码已上传)


小弟的机器环境:WINDOWS XP SP3  +  QT5.0.1





离线jdwx

只看该作者 1楼 发表于: 2013-04-18
回 楼主(zhangjin512) 的帖子
可以把整个的工程打包发上来,研究研究。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线zhangjin512

只看该作者 2楼 发表于: 2013-04-19
回 1楼(jdwx) 的帖子
代码已经上传了,版主大侠帮我看看呗
或者有没有其他解决办法,我这里主要是想实现圆角带阴影的窗体风格。
离线jdwx

只看该作者 3楼 发表于: 2013-04-19
回 2楼(zhangjin512) 的帖子
我测试了:debug和release,都没有问题,始终是正常的。Qt5.0.2 + VS2010 + window7
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线zhangjin512

只看该作者 4楼 发表于: 2013-04-19
回 3楼(jdwx) 的帖子
估计是跟操作系统有关系,之前就有发现QT5在XP上使用会存在一些问题,不知道QT5在发布的时候有没在XP系统上认真测试过。

谢谢jdwx,我回去用WIN7系统试试!
离线jdwx

只看该作者 5楼 发表于: 2013-04-19
回 4楼(zhangjin512) 的帖子
XP确实该下班了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线justwake

只看该作者 6楼 发表于: 2013-04-26
我这边XP下和你说的一样
出现这种现象的原因是:窗口没有改变大小的情况下paintEvent重复drawImage
调试+改正代码如下:(原理:保存窗口大小,不改变窗口大小的情况下不drawImage)


在XP下   正常   win7没有测试!欢迎有环境的朋友帮测试下!
另外问下楼主,您的代码有版权吗?
离线justwake

只看该作者 7楼 发表于: 2013-04-26
额刚才忘了发调试的:


离线zhangjin512

只看该作者 8楼 发表于: 2013-04-27
回 6楼(justwake) 的帖子
这位朋友的方法确实不错,谢谢!

另外,这个代码没有版权,如果能给大家的工作带来方便,是我的荣幸!
希望大家有好的东西,都可以拿出来一起学习交流和分享!
离线zhangjin512

只看该作者 9楼 发表于: 2013-04-27
经过在XP系统上测试,这位朋友给出的办法是解决了窗体重绘底图残留的问题,但是会导致窗体上控件重绘的问题,如下图:


看来只有一个办法了,把代码放到WIN7上去编译!
离线ppdayz

只看该作者 10楼 发表于: 2013-04-27
win7 也是一样
离线zhangjin512

只看该作者 11楼 发表于: 2013-04-28
回 10楼(ppdayz) 的帖子
我这边用虚拟机VMware安装了一个WIN7旗舰版,结果还是如问题所描述的那样。

但是在我自己的另外一台电脑上,安装的系统是WIN7旗舰版,运行就是正常的了。

可能跟WIN7系统打的补丁有关系吧
离线justwake

只看该作者 12楼 发表于: 2013-04-29
回 9楼(zhangjin512) 的帖子
是的    我起初是在paintEvent中重绘需要重绘的部分 比如那三个按钮  
我第二个想法是重绘除边框外的部分

不过 感觉太麻烦    最后还是使用了stylesheet来解决这个问题!手动绘还是太麻烦了!

离线hisong7

只看该作者 13楼 发表于: 2015-10-15
看了paintEvent() 部分代码,非常有帮助,非常感谢
离线sikaixiaoxun

只看该作者 14楼 发表于: 2016-01-15
后来如何解决的,能否共享一下代码,我这边和你的相似,但是拖动鼠标改变窗口大小时,窗口闪烁?
离线kqh1120

只看该作者 15楼 发表于: 2017-07-06
能否共享一下代码
快速回复
限100 字节
 
上一个 下一个