原理:移除原生自带的阴影,对于菜单以及所有的子菜单使用Qt的阴影,同时应用qss圆角样式。
    缺点: 有二级菜单时,点击了二级菜单有时候会有残影,而且容易重现。每次动态生成按钮可以解决这个问题。

    效果:
    1.gif

    代码:

    1. QList<QMenu *> listMenu;
    2. //手动添加需要设置的QMenu
    3. listMenu<<ui->menu_help<<ui->menu_settings;
    4. //找出所有的子孙Menu
    5. foreach (QMenu *menu, listMenu) {
    6. CUIHelper::recursionSubMenu(menu,listMenu); // 添加所有的子菜单到list中
    7. }
    8. //为所有的Menu 取消原装直角阴影 添加Qt的阴影
    9. foreach (QMenu *menu, listMenu) {
    10. menu->setWindowFlags(menu->windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
    11. menu->setAttribute(Qt::WA_TranslucentBackground,true);
    12. QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
    13. shadow->setOffset(0, 0);
    14. shadow->setColor(QColor("#444444"));
    15. shadow->setBlurRadius(10);
    16. menu->setGraphicsEffect(shadow);
    17. }

    qss样式表

    1. QMenu {
    2. color:black;
    3. background-color:white;
    4. border-radius:3px;
    5. padding:5px;
    6. margin:6px;
    7. }
    8. QMenu::item:text {
    9. padding-left:10px;
    10. padding-right:10px;
    11. }
    12. QMenu::item:selected{
    13. color:#1aa3ff;
    14. background-color: #e5f5ff;
    15. border-radius:3px;
    16. }
    17. QMenu::separator{
    18. height:1px;
    19. background:#bbbbbb;
    20. margin:5px;
    21. margin-left:10px;
    22. margin-right:10px;
    23. }

    工具函数,递归获取 QMenu 的子 menu

    1. void CUIHelper::recursionSubMenu(QMenu *menu,QList<QMenu *> &menus)
    2. {
    3. foreach (QAction *action, menu->actions()) {
    4. if(nullptr != action->menu()){
    5. menus.append(action->menu());
    6. recursionSubMenu(action->menu(),menus);
    7. }
    8. }
    9. }

    来源:
    https://blog.csdn.net/qq_41673920/article/details/116980362