原理:移除原生自带的阴影,对于菜单以及所有的子菜单使用Qt的阴影,同时应用qss圆角样式。
缺点: 有二级菜单时,点击了二级菜单有时候会有残影,而且容易重现。每次动态生成按钮可以解决这个问题。
效果:
代码:
QList<QMenu *> listMenu;//手动添加需要设置的QMenulistMenu<<ui->menu_help<<ui->menu_settings;//找出所有的子孙Menuforeach (QMenu *menu, listMenu) {CUIHelper::recursionSubMenu(menu,listMenu); // 添加所有的子菜单到list中}//为所有的Menu 取消原装直角阴影 添加Qt的阴影foreach (QMenu *menu, listMenu) {menu->setWindowFlags(menu->windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);menu->setAttribute(Qt::WA_TranslucentBackground,true);QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);shadow->setOffset(0, 0);shadow->setColor(QColor("#444444"));shadow->setBlurRadius(10);menu->setGraphicsEffect(shadow);}
qss样式表
QMenu {color:black;background-color:white;border-radius:3px;padding:5px;margin:6px;}QMenu::item:text {padding-left:10px;padding-right:10px;}QMenu::item:selected{color:#1aa3ff;background-color: #e5f5ff;border-radius:3px;}QMenu::separator{height:1px;background:#bbbbbb;margin:5px;margin-left:10px;margin-right:10px;}
工具函数,递归获取 QMenu 的子 menu
void CUIHelper::recursionSubMenu(QMenu *menu,QList<QMenu *> &menus){foreach (QAction *action, menu->actions()) {if(nullptr != action->menu()){menus.append(action->menu());recursionSubMenu(action->menu(),menus);}}}
来源:
https://blog.csdn.net/qq_41673920/article/details/116980362
