代码:

#ifndef COLORGRADIENTROUNDEDBUTTON_H
#define COLORGRADIENTROUNDEDBUTTON_H#include <QAbstractButton>
#include <QTimer>struct doubleColor
{doubleColor(QColor frist = Qt::red,QColor second = Qt::blue):fristColor(frist),secondColor(second){}QColor fristColor;QColor secondColor;bool operator !=(const doubleColor & c){return (this->fristColor != c.fristColor) || (this->secondColor != c.secondColor);}
};
Q_DECLARE_METATYPE(doubleColor)class ColorGradientRoundedButton : public QAbstractButton
{Q_OBJECTpublic:ColorGradientRoundedButton(QWidget *parent = nullptr);~ColorGradientRoundedButton()override;protected:void paintEvent(QPaintEvent *event)override;void enterEvent(QEnterEvent *event)override;void leaveEvent(QEvent *event)override;private:void onTimer();doubleColor startColor;doubleColor endColor;enum class ChangeModel{Plus,Minus};QTimer timer;int rectX{0};ChangeModel rectXChangeModel;
};
#endif // COLORGRADIENTROUNDEDBUTTON_H
#include "colorgradientroundedbutton.h"
#include <QPainter>
#include <QPaintEvent>
#include <QGraphicsDropShadowEffect>
#include <QDebug>
#include <QPainterPath>
#include <QRandomGenerator>QColor getRandomColor()
{return QColor(QRandomGenerator::global()->bounded(255),QRandomGenerator::global()->bounded(255),QRandomGenerator::global()->bounded(255));
}ColorGradientRoundedButton::ColorGradientRoundedButton(QWidget *parent): QAbstractButton(parent)
{startColor = doubleColor(getRandomColor(),getRandomColor());endColor = doubleColor(getRandomColor(),getRandomColor());this->setMinimumSize(180,50);setMouseTracking(true);QGraphicsDropShadowEffect * effect = new QGraphicsDropShadowEffect(this);setGraphicsEffect(effect);effect->setOffset(0,0);effect->setBlurRadius(25);effect->setColor(Qt::black);timer.setInterval(40);connect(&timer,&QTimer::timeout,this,&ColorGradientRoundedButton::onTimer);
}ColorGradientRoundedButton::~ColorGradientRoundedButton()
{
}void ColorGradientRoundedButton::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);auto rect = event->rect();auto rectWidth = rect.width();QPainterPath path;path.addRoundedRect(rect,25,25);painter.setClipPath(path);painter.drawRect(rect);QLinearGradient linearGradient1(QPoint(-rectX,0),QPoint(rectWidth - rectX,0));linearGradient1.setColorAt(0,startColor.fristColor);linearGradient1.setColorAt(1,startColor.secondColor);painter.fillRect(QRect(-rectX,0,rectWidth,rect.height()),linearGradient1);QLinearGradient linearGradient2(QPoint(rectWidth - rectX,0),QPoint(rectWidth * 2 - rectX,0));linearGradient2.setColorAt(0,endColor.fristColor);linearGradient2.setColorAt(1,endColor.secondColor);painter.fillRect(QRect(rectWidth - rectX,0,rectWidth,rect.height()),linearGradient2);auto font = painter.font();font.setBold(true);font.setPixelSize(20);painter.setFont(font);painter.setPen(Qt::white);painter.drawText(rect,Qt::AlignCenter,text());
}void ColorGradientRoundedButton::onTimer()
{if(rectXChangeModel == ChangeModel::Plus){rectX += (rect().width() / 6);if(rectX >= rect().width()){rectX = rect().width();timer.stop();}}else{rectX -= (rect().width() / 6);if(rectX <= 0){rectX = 0;timer.stop();}}update();
}void ColorGradientRoundedButton::enterEvent(QEnterEvent *event)
{if(timer.isActive())timer.stop();rectXChangeModel = ChangeModel::Plus;timer.start();QWidget::enterEvent(event);
}void ColorGradientRoundedButton::leaveEvent(QEvent *event)
{if(timer.isActive())timer.stop();rectXChangeModel = ChangeModel::Minus;timer.start();QWidget::leaveEvent(event);
}

使用示例:

    QWidget w;w.setPalette(Qt::white);auto vb = new QVBoxLayout;vb->setSpacing(15);for(int i = 0;i < 8;++i){auto btn = new ColorGradientRoundedButton;btn->setText(QString("按钮%1").arg(i));vb->addWidget(btn);}w.setLayout(vb);w.show();

效果:

Qt编写自定义控件:彩色渐变圆角按钮之二相关推荐

  1. qt creator 设置按键颜色_Qt编写自定义控件30-颜色多态按钮

    一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...

  2. Qt编写自定义控件29-颜色选取面板

    一.前言 这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制 ...

  3. Qt编写自定义控件4-旋转仪表盘

    前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...

  4. Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  5. 文字居中 qt_Qt编写自定义控件11-设备防区按钮控件

    前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...

  6. Qt编写自定义控件3-速度仪表盘

    前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...

  7. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  8. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

  9. Qt编写自定义控件及插件的使用

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

最新文章

  1. VS2005 / windows sdk7.1配置
  2. mysql 主被切换_mysql 主从切换
  3. GridView 用 checkbox 全选并取值
  4. java高级mysql面试题_Java高级面试题
  5. webpack4配置vue环境和一些小坑。
  6. 130个你需要了解的VIM命令
  7. MySQL MGR 5.7.22 on centos 6.3 单主/多主搭建测试
  8. JavaScript判断office的版本
  9. MySQL中order by的使用
  10. vue使用 axios 跨域
  11. python代理ip_python代理ip7个汇总技巧
  12. Win系统 - 如何彻底删除文件 / 文件夹?
  13. MyCms 自媒体 CMS 系统 v3.1.0,新增商城接口
  14. 编译ThingsBoard V3.3.2源码
  15. python中求合数_python输出100以内的质数与合数实例代码
  16. python爬取微信公众号_python使用webdriver爬取微信公众号
  17. ubuntu换源 树莓派
  18. CQL 函数及多深度关系节点
  19. matlab 野值剔除,一种基于多项式拟和的野值剔除方法与流程
  20. e签宝再获巨额融资,电子签赛道百亿规模后能冲多远?

热门文章

  1. KSO-.NETCore中实现跨域的代码以及几种跨域方式
  2. android 高斯模糊实现
  3. r语言remarkdown展示图_十个超级好用的R语言编程技巧,一般人绝不知道!
  4. k8s存储之Volumes卷类型
  5. MT7603处理器性能,MT7603 wifi芯片介绍
  6. python实现第三方验证码获取_python利用第三方模块,发送短信验证码(测试案例)...
  7. c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?
  8. 2019数据安装勾选_发票系统2.0平台安装及发票勾选操作步骤
  9. 你不可不知的Java引用类型之——SoftReference源码详解
  10. G - 数字转换 LibreOJ - 10155