Qt编写自定义控件:彩色渐变圆角按钮之二
代码:
#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编写自定义控件:彩色渐变圆角按钮之二相关推荐
- qt creator 设置按键颜色_Qt编写自定义控件30-颜色多态按钮
一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...
- Qt编写自定义控件29-颜色选取面板
一.前言 这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制 ...
- Qt编写自定义控件4-旋转仪表盘
前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...
- Qt编写自定义控件44-天气仪表盘
一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...
- 文字居中 qt_Qt编写自定义控件11-设备防区按钮控件
前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...
- Qt编写自定义控件3-速度仪表盘
前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...
- Qt编写自定义控件14-环形进度条
前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...
- Qt编写自定义控件35-GIF录屏控件
一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...
- Qt编写自定义控件及插件的使用
在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...
最新文章
- VS2005 / windows sdk7.1配置
- mysql 主被切换_mysql 主从切换
- GridView 用 checkbox 全选并取值
- java高级mysql面试题_Java高级面试题
- webpack4配置vue环境和一些小坑。
- 130个你需要了解的VIM命令
- MySQL MGR 5.7.22 on centos 6.3 单主/多主搭建测试
- JavaScript判断office的版本
- MySQL中order by的使用
- vue使用 axios 跨域
- python代理ip_python代理ip7个汇总技巧
- Win系统 - 如何彻底删除文件 / 文件夹?
- MyCms 自媒体 CMS 系统 v3.1.0,新增商城接口
- 编译ThingsBoard V3.3.2源码
- python中求合数_python输出100以内的质数与合数实例代码
- python爬取微信公众号_python使用webdriver爬取微信公众号
- ubuntu换源 树莓派
- CQL 函数及多深度关系节点
- matlab 野值剔除,一种基于多项式拟和的野值剔除方法与流程
- e签宝再获巨额融资,电子签赛道百亿规模后能冲多远?
热门文章
- KSO-.NETCore中实现跨域的代码以及几种跨域方式
- android 高斯模糊实现
- r语言remarkdown展示图_十个超级好用的R语言编程技巧,一般人绝不知道!
- k8s存储之Volumes卷类型
- MT7603处理器性能,MT7603 wifi芯片介绍
- python实现第三方验证码获取_python利用第三方模块,发送短信验证码(测试案例)...
- c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?
- 2019数据安装勾选_发票系统2.0平台安装及发票勾选操作步骤
- 你不可不知的Java引用类型之——SoftReference源码详解
- G - 数字转换 LibreOJ - 10155