当前位置 博文首页 > TranslucentBackground CEF界面无法展现 透明无效_漫步繁华街的

    TranslucentBackground CEF界面无法展现 透明无效_漫步繁华街的

    作者:[db:作者] 时间:2021-07-26 14:55

    本周在写登录框阴影的时候遇到一个奇怪的问题,本来一个阴影问题,至少有三四种解决方案: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,来实现我们所有的功能了。

    cs