QStyleOptionGraphicsItem实现自绘按钮悬浮按下状态
Qt官方自带的例子animatedtiles,该工程存放在Qt安装目录下的
Examples\Qt-XX.XX.XX\widgets\animation\animatedtiles 目录
其中XX.XX.XX为Qt的版本号,如:5.14.1。有如下代码:
class Button : public QGraphicsWidget
{Q_OBJECT
public:...... // 该部分代码略,请参见Qt官方自带的例子查看void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override{bool down = option->state & QStyle::State_Sunken;QRectF r = boundingRect();QLinearGradient grad(r.topLeft(), r.bottomRight());grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray);grad.setColorAt(down ? 0 : 1, Qt::darkGray);painter->setPen(Qt::darkGray);painter->setBrush(grad);painter->drawEllipse(r);QLinearGradient grad2(r.topLeft(), r.bottomRight());grad.setColorAt(down ? 1 : 0, Qt::darkGray);grad.setColorAt(down ? 0 : 1, Qt::lightGray);painter->setPen(Qt::NoPen);painter->setBrush(grad);if (down)painter->translate(2, 2);painter->drawEllipse(r.adjusted(5, 5, -5, -5));painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix);}...... // 该部分代码略,请参见Qt官方自带的例子查看
};
第9行代码:判断按钮是否被鼠标按下了,如果按钮被按下,则:
ption->state & QStyle::State_Sunken即down就为true,否则就会false。
第10-16行:创建一个渐变画刷和一个Qt::darkGray颜色的画笔。并利用该画刷、画笔在按钮所在最小外包围矩形中绘制了一个圆形。创建画刷的思路是:
- 从按钮最小外包围矩形左上角到右下角进行渐变。
- 如果鼠标将按钮按下 了,则设置渐变的起点颜色为Qt::darkGray、终点颜色为Qt::white。
此时第12、13行代码变为:
grad.setColorAt(1, Qt::white);
grad.setColorAt(0, Qt::darkGray);
此时绘制出的按钮如下(注意:17行后的代码都注释掉了,这里仅仅显示的是17行之前的代码效果):
可以看到从左上角的深灰渐变到右下角的白色。
- 如果鼠标没将按钮按下,仅仅是悬浮在按钮上面,则此时第12、13行代码变为:
grad.setColorAt(0, Qt::white);
grad.setColorAt(1, Qt::darkGray);
此时绘制出来的效果如下(注意:17行后的代码都注释掉了,这里仅仅显示的是17行之前的代码效果):
可以看到从左上角的白色渐变到右下角的深灰色。
- 如果鼠标既没按下按钮也没悬浮在按钮上面,则第12、13行代码如下:
grad.setColorAt(0, Qt::lightGray);
grad.setColorAt(1, Qt::darkGray);
效果如下(注意:17行后的代码都注释掉了,这里仅仅显示的是17行之前的代码效果):
可以看到从左上角的浅灰色渐变到右下角的深灰色。
第17-21行:如果鼠标被按下,则创建浅灰到深灰渐变画刷;如果鼠标没按下按钮,则创建深灰到浅灰渐变画刷。注:第20行画笔一定要是Qt::NoPen,否则第24行创建的圆形和第16行创建的圆形有画笔留下的痕迹,进而明显可以看出不是一个整体的圆形。
第24行:因为15行设置的渐变画刷和21行设置的渐变画刷不一样,再加上本行将按钮最小外包矩形宽高缩小10个单位,这样创建的两个圆形有显著的凸凹视觉效果,更逼真,如下(注释掉了第25行代码后的效果):
第22-23行:如果按钮被按下了,就将坐标系向右、向下平移2个单位,这样就会给人造成按下的逼真视觉效果。
至此,本函数分析完毕!
QStyleOptionGraphicsItem实现自绘按钮悬浮按下状态相关推荐
- mfc怎么改按钮的按下状态_【荐读】马桶上一大一小的按钮该怎么按?原来这些年都错了...
马桶水箱上有两个冲水钮,一半大一半小,你知道它们有什么作用吗?日常使用马桶时两个冲水按钮,要怎么按才正确?今天终于有答案了..... 两按钮的作用 水箱一大一小的按钮,分别代表着满水和半水排水的功能. ...
- C#如何将按钮置于按下状态
http://blog.sina.com.cn/s/blog_4cb9ca200100iz7s.html 三种实现方法: 一.选用Button控件,在单击事件中,写代码控制按钮的外观或改变 FlatS ...
- 重写highlighted改变按钮的按下状态、
- 自绘按钮实现颜色选择器
一.前言 很多时候,我们需要让用户在软件上选择颜色,那么一个"颜色选择器"就肯定需要了,本例程就是使用普通的按钮(Button)控件来实现颜色选择器. 首先来看一下最后的效果图: ...
- MFC 进度条自绘按钮类
MFC 进度条自绘按钮类 废话不多说 先看效果 看看怎么调用 这当然先包含砸门的进度条绘图类 #include "MySlider.h"MySlider m_lider;//防在D ...
- 改变按钮在iPhone下的默认风格
-webkit-appearance: none; "来改变按钮在iPhone下的默认风格,其实我们可以反过来思路,使用"appearance"属性,来改变任何元素的浏览 ...
- Form表单提交按钮图片IE6下背景透明(js提交)
Form表单提交按钮图片IE6下背景透明(js提交) 我们知道 光png图片在IE6下面透明方法很多,网上也很多,但是我今天遇到了个难题:form表单提交按钮png图片要求背景透明.我弄了半天,转个思 ...
- 按钮悬浮固定在微信小程序底部
http://mydown.yesky.com/news/87296687.html 本章节主要介绍了如何将操作按钮悬浮固定在微信小程序底部?操作起来也比较简单,还不会的朋友一起跟着小编学习一下吧,希 ...
- WindowsAPI自绘按钮
自绘按钮有多种方法,比如创建一个BS_OWNERDRAW风格的按钮,然后就可以自绘了,但是这个好像不能用SetWindowRgn画各种形状.我介绍的这个方法很简单,但是代码量会稍多一点.就是把一个按钮 ...
最新文章
- 内存对齐与ANSI C中struct型数据的内存布局 【转】
- Web前端css知识点概括
- logging日志配置,day95下午
- [转]如何编写 INF 文件
- 链路追踪之zipkin
- HDU 6579 Operation (前缀线性基模板题)
- python画相关性可视化图_Python 可视化 | 关联图 - 散点图1
- 录音文件下载_如何免费下载受版权保护的收费音乐
- wgc84 笛卡尔_WGS84椭球下的UTM坐标与Clarke80椭球下的兰勃特坐标转换方法研究
- 深度强化学习-策略梯度算法深入理解
- 小米电视ec、小米电视es、小米电视ea2022款的区别
- 模电1.1 半导体基础知识
- https web service(转)
- 召回率(rec),准确率(acc),精确率(pre),F1值
- 福禄克FLUKE DTX-1800和DSX2-8000系列电缆认证分析仪如何导出测试报告?
- emac接口与phy交互
- 基于百度云通过Python实现简单的营业执照识别
- 5种方法输出10的阶乘
- 汽车零部件行业困境及如何利用MES解决?
- STC-ISP 串口打开失败,请检查指定串口
热门文章
- 自行车实现无人驾驶,背后究竟有何“天机”?
- FPGA车牌数字识别系统设计verilog实现(带上板录制视频)
- oracle 磁盘不分区吗,LINUX停ORACLE软件、数据文件等所在的磁盘分区空间不足的解决思路...
- js插件 ajax跨域,ajax跨域问题
- 贝叶斯分类器_python机器学习API介绍10:多项式贝叶斯分类器
- display:table的几个用法
- 有关UITabbarController的一些重要属性
- 浅谈Javascript中的函数重载实现
- Windows7系统技巧:常用的10个快捷键
- [转]JS日期选择控件