QT WA_TranslucentBackground CEF界面无法展现 透明无效

15 篇文章 8 订阅

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

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
下面是在 Qt 窗口嵌入 CEF 窗口的基本步骤: 1. 在 Qt 项目中添加 CEF 的库文件和头文件: 在 Qt 项目中添加 CEF 的库文件和头文件,以便在 Qt 中使用 CEF 控件。 2. 创建 CEF 控件: 在 Qt 窗口中创建 CEF 控件,可以使用 CEF 提供的 API 创建控件,例如: ```cpp CefRefPtr<CefBrowser> browser = CreateBrowser(hwnd, url); ``` 其中,hwnd 是 Qt 窗口的句柄,url 是要加载的 Web 页面的地址。 3. 将 CEF 控件的窗口嵌入到 Qt 窗口中: 使用 Qt 提供的 API 将 CEF 控件的窗口嵌入到 Qt 窗口中,例如: ```cpp CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle(); QWindow *window = QWindow::fromWinId((WId)hwnd); QWidget *widget = QWidget::createWindowContainer(window); ``` 其中,browser 是创建的 CEF 控件,hwnd 是 CEF 控件的窗口句柄,window 是 Qt 窗口对象,widget 是包含 CEF 控件窗口的 Qt 控件。 4. 将 Qt 控件添加到 Qt 窗口中: 在 Qt 窗口中添加包含 CEF 控件窗口的 Qt 控件,例如: ```cpp QVBoxLayout *layout = new QVBoxLayout(ui->centralWidget); layout->addWidget(widget); ``` 其中,ui->centralWidget 是 Qt 窗口的中心控件,layout 是 Qt 窗口的布局管理器。 这样,CEF 控件就可以嵌入到 Qt 窗口中了。 注意事项: 在将 CEF 控件嵌入到 Qt 窗口中时,需要注意以下几点: 1. Qt 窗口和 CEF 控件窗口之间的大小和位置关系需要正确设置,以保证 CEF 控件窗口完全嵌入到 Qt 窗口中。 2. 在使用 CEF 控件时,需要遵循 CEF 的许可协议。 3. 在使用 Qt 控件时,需要遵循 Qt 的许可协议。 4. 在将 CEF 控件嵌入到 Qt 窗口中时,需要注意相关的技术和代码的兼容性。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值