赞
踩
本周在写登录框阴影的时候遇到一个奇怪的问题,本来一个阴影问题,至少有三四种解决方案:1.使用QT框架自带的QEffectShadow 2.重绘空间的painter函数,使用画图形的方式。3.使用带有阴影的背景图片等方法。但是这些常用的阴影方法放到我们的登录界面却问题重重,没有一个能够实现我们想要的功能。这时候就陷入了困境,能想到的常规方法都用了,不知从何下手。后来静下心来仔细分析代码,为什么在别的控件能用的方法到我们这个登录窗口就不能使用?于是屏蔽几乎所有的代码,然后逐行打开,直到不能用的那一刻。经过分析与调试,得出我们的登录框有以下几个特点:
1.使用 setWindowFlags(Qt::FramelessWindowHint)将对话框自带的边框去除,使用我们自定义的边框。
2.使用setAttribute(Qt::WA_TranslucentBackground);为了使透明效果生效。
3.我们的登录框中嵌入了cef页面进行扫描登录。
经过调试,这三个条件出现了互斥,使用了第二个之后,cef界面就显示不出来。不使用第二个,cef页面可以加载,但是阴影就是一团黑色。如果第一条不去除边框,阴影可以使用,cef页面也可以正常显示,但是就不可以定制边框。
经过在qt论坛查询,这个问题属于qt的一个bug。
但是对于我们就需要寻找新的解决方法,既能除去边框,实现阴影,又能让cef页面正常加载。
这时候我们选择性的去掉了第二条阴影效果,先保证1和3有效,对于阴影我们选择其他的其他方式。经过@老师指导,并给出一个解决方案,就是我们在创建登录对话框的时候,同时创建一个新的对话框例如命名为m_ShadowBox。m_ShadowBox只负责渲染阴影,而且总是紧紧的显示在登录对话框后面,造成一种登录对话框有阴影的感觉。
这时候,我们对于m_ShadowBox,我们需要在构建登录对话框的时候初始化m_ShadowBox,
然后对于m_ShadowBox按照正常的阴影处理方法:我们选取背景图片是阴影的效果,然后重绘paintevent,函数,将背景图片绘制到对话框上:
然后设置阴影对话框m_ShadowBox,的位置在登录对话框的正后方,并上下左右各比登录对话框大15px。用于显示出阴影。
然后我们需要确定一些细节:
1.当登录界面显示的时候,同步显示m_ShadowBox
2.当登录界面隐藏的时候,同步隐藏m_ShadowBox
3.当登录界面 移动的时候,同步移动m_ShadowBox
4.当程序的状态(显示但未激活,未显示未激活,显示激活等)几种状态更改的时候,需要同步激活m_ShadowBox
这样就可以绕开框架的bug,来实现我们所有的功能了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。