Qt 窗口强制禁用系统阴影(自定义菜单)
解决方法
当只使用Qt::FramelessWindowHint时,不会显示系统阴影,因为自定义菜单一般都会添加Qt::Popup,添加Qt::Popup后系统会默认添加阴影效果。
在添加Qt::Popup后,继续添加Qt::NoDropShadowWindowHint枚举解决。
最小复现代码:
QDialog *dia = new QDialog(); dia->setWindowFlags(Qt::FramelessWindowHint|Qt::Popup); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_StyledBackground); setAttribute(Qt::WA_DeleteOnClose); dia->setStyleSheet("background: white;"); dia->show();
发现窗口四周有阴影,当添加Qt::NoDropShadowWindowHint后解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | QDialog *dia = new QDialog(); dia->setAttribute(Qt::WA_TranslucentBackground); dia->setAttribute(Qt::WA_StyledBackground); dia->setAttribute(Qt::WA_DeleteOnClose); dia->setWindowFlags(Qt::FramelessWindowHint|Qt::Popup|<strong>Qt::NoDropShadowWindowHint</strong>); QWidget *wid = new QWidget(); wid->setStyleSheet( "background: red;" ); QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(wid); layout->setMargin(15); dia->setLayout(layout); dia->setGeometry( this ->pos().x(), this ->pos().y(), 100, 200); dia->show(); |
问题背景
Windows 默认情况下开启阴影,这就导致使用Qt做的一些透明背景自定义菜单显示不正常(例如椭圆角的菜单):
没设置系统阴影时显示正常:
设置系统阴影后:
主要原因是由于菜单四周是圆角,Windows窗口又不支持圆角,只能父窗口透明,子窗口圆角显示:
最终效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!