文章目录

  • 最终效果
  • 1.代码
  • 2.解决过程
    • 我用Qss美化
    • 不行,再加个边框
    • 我不仅用Qss美化 还要200万的圆角
    • 什么?还想要不要钱阴影,我加

最终效果

1.代码

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);}}return ;
}

2.解决过程

我用Qss美化

由于系统自带的阴影效果太丑,于是开始了美化之路。

仅用Qss美化之后的效果,上边和左边没有阴影,边界不明显,那我们可以添加个边框让边界更明显一些。

不行,再加个边框
QMenu {color:black;background-color: white; border:1px solid #bbbbbb;
}QMenu::item:text { padding-left:10px;padding-right:10px;
}QMenu::item:selected { color:#1aa3ff;background-color: #e5f5ff;border-radius:3px;
}


添加边框后,到这里如果觉得美观度已经可以的话就散花结束,复制上边Qss就可以实现了。因为你想加圆角的话,还有一些坑。。。就是要加一丢丢丢丢…代码

我不仅用Qss美化 还要200万的圆角

修改圆角属性,但却得到这么个Bug效果

Bug效果似乎不明显,加大圆角,看个清楚

四角都有白色背景底,而且阴影的角还是直的,设置Menu的背景透明试试。

menu->setAttribute(Qt::WA_TranslucentBackground); //Menu背景透明


怎么Bug还越来越丑了!!!,谷歌百度看看有没有大佬解决,果然有人做了圆角,并解决了四角黑点问题。复制代码加上

 menu->setWindowFlags(menu->windowFlags()  | Qt::FramelessWindowHint );


四角黑点倒是没有了,也透明了,可以看到Menu下边的按钮图标。但是这个阴影也太丑了。如何去掉阴影?搜索一番之后,有的继承QMenu过滤WIndows事件来屏蔽阴影。太麻烦,继续搜索

menu->setWindowFlags(menu->windowFlags()  | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);

这个看着就靠谱,Qt提供的去窗口阴影属性。

阴影没了,四角也透明了,就是Item有点Bug,那个改下Qss就行,修改Qss圆角小点。

到这里圆角美化就搞定了

什么?还想要不要钱阴影,我加

加阴影这事,早就轻车熟路了,干

        QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);shadow->setOffset(0, 0);shadow->setColor(QColor("#444444"));shadow->setBlurRadius(10);menu->setGraphicsEffect(shadow);


阴影不明显,这小问题了,明显就是parent和子控件大小一样,阴影没地显示。修改Qss margin:5px;
给阴影留空。而且有阴影凸显边界了,去掉边框,显得更高级些,干掉边框border:1px solid #bbbbbb;

这不就搞定了,等等又发现了个Bug!!!

我们只设置了一级Menu无边框、无系统阴影等,二级菜单只应用了Qss,代码没有设置Menu属性,难道要一个Mennu设置一堆吗?像我这种懒人是不可能这么弄的,查看帮助手册,能获取到Menu的Actions,Action又能获取到后边有没有Menu,没错,就得递归。怎么用呢,给它一个Menu,把子孙Menu都加到list里,写个静态函数,一遍搞定

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);}}return ;
}

用这个函数就能把Menu的子Menu都追加到list里,接着就把所有的一级Menu遍历,逐个递归就能把所有的Menu找到了,然后一个个设置属性,再加多少级Menu也不用添加设置属性的代码、

    QList<QMenu *> listMenu;//手动把界面一级Menu添加到list中listMenu<<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);}

相对完结,还留下两个个人可以忍受的Bug
1.由于Mebu margin:5px;的原因,Menu往右、往下偏移了5px,位置不算太正
2.Menu设置Qt::FramelessWindowHint属性,导致弹出时候有个错误
UpdateLayeredWindowIndirect failed for ptDst=(600, 147), size=(97x87), dirty=(107x37 -5, 55) (参数错误。)。不过没发现影响使用
以上两个Bug有大佬解决欢迎回复!!!!

Qt QMenu圆角阴影超详细 干净圆角 屏蔽原生阴影 绘制阴影相关推荐

  1. Qt项目打包发布超详细教程

    文章目录 前期准备工作 一.发布方式 (一)手动发布 (二)windeployqt发布 二.打包成.exe安装包 注意:后面的所有语句中涉及到编译器的,请大家自行替换成自己用的编译器,我这里使用的是M ...

  2. QT打包完整教程 超详细

    "SmartQT项目" 打包流程为例: 步骤一:进入SmartQT项目,选择编译选项[1],[2]指定为Release版本编译,最后点击[3]执行编译操作; 步骤二:在SmartQ ...

  3. Qt项目-----简易QQ(超详细,适合小白)

    创建新项目 新建项目,以Qt Widgets Application为模板 选择QWidget为基类 建立完成后,项目视图如下所示: 注意:建立好项目后,可以先编译运行下,确定建立的项目没有问题. 创 ...

  4. Verilog:【7】超详细WaveDrom教程,时序图绘制利器,看这一篇就够了。

    碎碎念: 没想到上一篇发出去,前几个小时竟然基本没人看,是我写得太晦涩了吗,这篇介绍个简单但是相当好用的软件WaveDrom,可以非常方便的绘制时序图,简直是数字人的福音啦! 本文将从安装开始,详细介 ...

  5. C++ 超详细8Bit图像直方图统计并绘制显示,不使用calcHist()函数,自己手写统计

    C++ OpenCv中提供的函数calcHist()可以很方便的帮助我们统计一幅8Bit图像的直方图,但是有时候我们不想用OpenCv提供的函数来统计,想自己根据自己的需求来做一个统计,那么看这个教程 ...

  6. matlab如何绘制像素格子的图_【像素画教程】超详细建筑像素场景图的绘制

    这里我们以一幅傍晚的南京大牌档场景图作为例子,使用的软件是Aseprite. 一.搜集素材 1.建筑主体 过年了,画一个有年味儿的南京特色风景线南京大牌档.网上搜图+全景地图截图 2.背景 黄昏天空 ...

  7. ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》

    今年本命年想做个表情包,但是之前没有做过,在网上搜索教程时,没有找到很有用的.所以我大部分都是看很多喜欢的表情包,然后录屏逐帧来分析的. 在表情包做完后,想要做一个记录总结,分享给同样想做表情包的新手 ...

  8. 超详细基于Qt平台实现C/C++调用Matlab函数全流程

    超详细基于Qt平台实现C/C++调用Matlab函数全流程 1. 基本调用方式介绍 2. 环境配置 3. 将Matlab程序写成函数形式 4. Matlab配置C编译器,将.m文件转换成动态链接库 4 ...

  9. Qt基础入门到进阶实战资料大全(纯干货,超详细,随时更新)

    文章目录 1.简介 2.Qt官网 3.Qt开源社区 1)国内社区 a)CSDN 社区 b)Qter社区 c)QTCN开发网 2)国外社区 a)QT software b)Qt Center c)Dev ...

  10. Qt实现登录效果(超详细!超简单!)

    title: Qt实现登录效果(超详细!超简单!) date: 2022-8-13 tags: 学习 C++ Qt categories: Qt :::tip

最新文章

  1. keras 使用多GPU
  2. 8 基于管道的持久化存储 scrapy
  3. guava中的Strings
  4. python hdfs初体验
  5. VIJOS1212 Way Selection
  6. 一款世界上最快的固态硬盘
  7. 在idea上配置hadoop开发环境,使用maven配置hadoop的依赖,自动管理相关jar包
  8. Java 编程下的并发线程之间的同步代码块死锁
  9. MNIST手写数字数据集格式,如何读取MNIST数据集?
  10. phtml php,PHTML Encoder
  11. 活动选择问题 贪心
  12. Stanford机器学习---第一讲. Linear Regression with one variable
  13. 《国民经济行业分类GB/T 4754—2017》官网下载地址
  14. azw3、epub、PDF等格式转换
  15. 第二章 大数据技术概述
  16. 又要数数小绵羊(C++) kkmd66
  17. jquery+ajax分页
  18. 最新仿山楂岛留言程序源码+轻量级简约
  19. unity3d摄像机
  20. org.hibernate.MappingException: Unknown entity: com.yyw.bean.Post几种可能

热门文章

  1. 06.SpringBoot的webjars和静态资源映射
  2. [生活日记] 社会真的这么乱?尼姑也行骗,道德何在
  3. csv可以保存特殊字符_浅谈CSV注入漏洞
  4. c语言中有123f,C语言库函数(S类字母) - 3
  5. 大电流场效应管500a_不可不知的电子工程常用的6大电子元器件,了解一下!
  6. CMU 15-213 Introduction to Computer Systems学习笔记(11) Cache Memories
  7. jdbc和mysql做游戏排行榜_MySQL 和 JDBC编程
  8. rabbitmq 一个生产者多个消费者_RabbitMQ入门学习系列(二),单生产者消费者
  9. opengl开启垂直同步_应该开启“垂直同步”吗 ?
  10. c语言如何删除链表相同元素,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...