Qt QMenu圆角阴影超详细 干净圆角 屏蔽原生阴影 绘制阴影
文章目录
- 最终效果
- 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圆角阴影超详细 干净圆角 屏蔽原生阴影 绘制阴影相关推荐
- Qt项目打包发布超详细教程
文章目录 前期准备工作 一.发布方式 (一)手动发布 (二)windeployqt发布 二.打包成.exe安装包 注意:后面的所有语句中涉及到编译器的,请大家自行替换成自己用的编译器,我这里使用的是M ...
- QT打包完整教程 超详细
"SmartQT项目" 打包流程为例: 步骤一:进入SmartQT项目,选择编译选项[1],[2]指定为Release版本编译,最后点击[3]执行编译操作; 步骤二:在SmartQ ...
- Qt项目-----简易QQ(超详细,适合小白)
创建新项目 新建项目,以Qt Widgets Application为模板 选择QWidget为基类 建立完成后,项目视图如下所示: 注意:建立好项目后,可以先编译运行下,确定建立的项目没有问题. 创 ...
- Verilog:【7】超详细WaveDrom教程,时序图绘制利器,看这一篇就够了。
碎碎念: 没想到上一篇发出去,前几个小时竟然基本没人看,是我写得太晦涩了吗,这篇介绍个简单但是相当好用的软件WaveDrom,可以非常方便的绘制时序图,简直是数字人的福音啦! 本文将从安装开始,详细介 ...
- C++ 超详细8Bit图像直方图统计并绘制显示,不使用calcHist()函数,自己手写统计
C++ OpenCv中提供的函数calcHist()可以很方便的帮助我们统计一幅8Bit图像的直方图,但是有时候我们不想用OpenCv提供的函数来统计,想自己根据自己的需求来做一个统计,那么看这个教程 ...
- matlab如何绘制像素格子的图_【像素画教程】超详细建筑像素场景图的绘制
这里我们以一幅傍晚的南京大牌档场景图作为例子,使用的软件是Aseprite. 一.搜集素材 1.建筑主体 过年了,画一个有年味儿的南京特色风景线南京大牌档.网上搜图+全景地图截图 2.背景 黄昏天空 ...
- ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》
今年本命年想做个表情包,但是之前没有做过,在网上搜索教程时,没有找到很有用的.所以我大部分都是看很多喜欢的表情包,然后录屏逐帧来分析的. 在表情包做完后,想要做一个记录总结,分享给同样想做表情包的新手 ...
- 超详细基于Qt平台实现C/C++调用Matlab函数全流程
超详细基于Qt平台实现C/C++调用Matlab函数全流程 1. 基本调用方式介绍 2. 环境配置 3. 将Matlab程序写成函数形式 4. Matlab配置C编译器,将.m文件转换成动态链接库 4 ...
- Qt基础入门到进阶实战资料大全(纯干货,超详细,随时更新)
文章目录 1.简介 2.Qt官网 3.Qt开源社区 1)国内社区 a)CSDN 社区 b)Qter社区 c)QTCN开发网 2)国外社区 a)QT software b)Qt Center c)Dev ...
- Qt实现登录效果(超详细!超简单!)
title: Qt实现登录效果(超详细!超简单!) date: 2022-8-13 tags: 学习 C++ Qt categories: Qt :::tip
最新文章
- keras 使用多GPU
- 8 基于管道的持久化存储 scrapy
- guava中的Strings
- python hdfs初体验
- VIJOS1212 Way Selection
- 一款世界上最快的固态硬盘
- 在idea上配置hadoop开发环境,使用maven配置hadoop的依赖,自动管理相关jar包
- Java 编程下的并发线程之间的同步代码块死锁
- MNIST手写数字数据集格式,如何读取MNIST数据集?
- phtml php,PHTML Encoder
- 活动选择问题 贪心
- Stanford机器学习---第一讲. Linear Regression with one variable
- 《国民经济行业分类GB/T 4754—2017》官网下载地址
- azw3、epub、PDF等格式转换
- 第二章 大数据技术概述
- 又要数数小绵羊(C++) kkmd66
- jquery+ajax分页
- 最新仿山楂岛留言程序源码+轻量级简约
- unity3d摄像机
- org.hibernate.MappingException: Unknown entity: com.yyw.bean.Post几种可能
热门文章
- 06.SpringBoot的webjars和静态资源映射
- [生活日记] 社会真的这么乱?尼姑也行骗,道德何在
- csv可以保存特殊字符_浅谈CSV注入漏洞
- c语言中有123f,C语言库函数(S类字母) - 3
- 大电流场效应管500a_不可不知的电子工程常用的6大电子元器件,了解一下!
- CMU 15-213 Introduction to Computer Systems学习笔记(11) Cache Memories
- jdbc和mysql做游戏排行榜_MySQL 和 JDBC编程
- rabbitmq 一个生产者多个消费者_RabbitMQ入门学习系列(二),单生产者消费者
- opengl开启垂直同步_应该开启“垂直同步”吗 ?
- c语言如何删除链表相同元素,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...