原理:移除原生自带的阴影,对于菜单以及所有的子菜单使用Qt的阴影,同时应用qss圆角样式。
缺点: 有二级菜单时,点击了二级菜单有时候会有残影,而且容易重现。每次动态生成按钮可以解决这个问题。
效果:
代码:
QList<QMenu *> listMenu;
//手动添加需要设置的QMenu
listMenu<<ui->menu_help<<ui->menu_settings;
//找出所有的子孙Menu
foreach (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