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实现自绘按钮悬浮按下状态相关推荐

  1. mfc怎么改按钮的按下状态_【荐读】马桶上一大一小的按钮该怎么按?原来这些年都错了...

    马桶水箱上有两个冲水钮,一半大一半小,你知道它们有什么作用吗?日常使用马桶时两个冲水按钮,要怎么按才正确?今天终于有答案了..... 两按钮的作用 水箱一大一小的按钮,分别代表着满水和半水排水的功能. ...

  2. C#如何将按钮置于按下状态

    http://blog.sina.com.cn/s/blog_4cb9ca200100iz7s.html 三种实现方法: 一.选用Button控件,在单击事件中,写代码控制按钮的外观或改变 FlatS ...

  3. 重写highlighted改变按钮的按下状态、

  4. 自绘按钮实现颜色选择器

    一.前言 很多时候,我们需要让用户在软件上选择颜色,那么一个"颜色选择器"就肯定需要了,本例程就是使用普通的按钮(Button)控件来实现颜色选择器. 首先来看一下最后的效果图: ...

  5. MFC 进度条自绘按钮类

    MFC 进度条自绘按钮类 废话不多说 先看效果 看看怎么调用 这当然先包含砸门的进度条绘图类 #include "MySlider.h"MySlider m_lider;//防在D ...

  6. 改变按钮在iPhone下的默认风格

    -webkit-appearance: none; "来改变按钮在iPhone下的默认风格,其实我们可以反过来思路,使用"appearance"属性,来改变任何元素的浏览 ...

  7. Form表单提交按钮图片IE6下背景透明(js提交)

    Form表单提交按钮图片IE6下背景透明(js提交) 我们知道 光png图片在IE6下面透明方法很多,网上也很多,但是我今天遇到了个难题:form表单提交按钮png图片要求背景透明.我弄了半天,转个思 ...

  8. 按钮悬浮固定在微信小程序底部

    http://mydown.yesky.com/news/87296687.html 本章节主要介绍了如何将操作按钮悬浮固定在微信小程序底部?操作起来也比较简单,还不会的朋友一起跟着小编学习一下吧,希 ...

  9. WindowsAPI自绘按钮

    自绘按钮有多种方法,比如创建一个BS_OWNERDRAW风格的按钮,然后就可以自绘了,但是这个好像不能用SetWindowRgn画各种形状.我介绍的这个方法很简单,但是代码量会稍多一点.就是把一个按钮 ...

最新文章

  1. 内存对齐与ANSI C中struct型数据的内存布局 【转】
  2. Web前端css知识点概括
  3. logging日志配置,day95下午
  4. [转]如何编写 INF 文件
  5. 链路追踪之zipkin
  6. HDU 6579 Operation (前缀线性基模板题)
  7. python画相关性可视化图_Python 可视化 | 关联图 - 散点图1
  8. 录音文件下载_如何免费下载受版权保护的收费音乐
  9. wgc84 笛卡尔_WGS84椭球下的UTM坐标与Clarke80椭球下的兰勃特坐标转换方法研究
  10. 深度强化学习-策略梯度算法深入理解
  11. 小米电视ec、小米电视es、小米电视ea2022款的区别
  12. 模电1.1 半导体基础知识
  13. https web service(转)
  14. 召回率(rec),准确率(acc),精确率(pre),F1值
  15. 福禄克FLUKE DTX-1800和DSX2-8000系列电缆认证分析仪如何导出测试报告?
  16. emac接口与phy交互
  17. 基于百度云通过Python实现简单的营业执照识别
  18. 5种方法输出10的阶乘
  19. 汽车零部件行业困境及如何利用MES解决?
  20. STC-ISP 串口打开失败,请检查指定串口

热门文章

  1. 自行车实现无人驾驶,背后究竟有何“天机”?
  2. FPGA车牌数字识别系统设计verilog实现(带上板录制视频)
  3. oracle 磁盘不分区吗,LINUX停ORACLE软件、数据文件等所在的磁盘分区空间不足的解决思路...
  4. js插件 ajax跨域,ajax跨域问题
  5. 贝叶斯分类器_python机器学习API介绍10:多项式贝叶斯分类器
  6. display:table的几个用法
  7. 有关UITabbarController的一些重要属性
  8. 浅谈Javascript中的函数重载实现
  9. Windows7系统技巧:常用的10个快捷键
  10. [转]JS日期选择控件