Qt编写自定义控件:彩色渐变圆角按钮之一
2021/11/18 23:10:57
本文主要是介绍Qt编写自定义控件:彩色渐变圆角按钮之一,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
代码:
#ifndef COLORGRADIENTROUNDEDBUTTON_H #define COLORGRADIENTROUNDEDBUTTON_H #include <QAbstractButton> 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_OBJECT Q_PROPERTY(doubleColor currentColor MEMBER currentColor) public: ColorGradientRoundedButton(QWidget *parent = nullptr); ~ColorGradientRoundedButton()override; protected: void paintEvent(QPaintEvent *event)override; void enterEvent(QEnterEvent *event)override; void leaveEvent(QEvent *event)override; private: void onValueChanged(const QVariant &value); doubleColor currentColor; doubleColor startColor; doubleColor endColor; class QPropertyAnimation * animation{nullptr}; }; #endif // COLORGRADIENTROUNDEDBUTTON_H
#include "colorgradientroundedbutton.h" #include <QPainter> #include <QPaintEvent> #include <QGraphicsDropShadowEffect> #include <QPropertyAnimation> #include <QDebug> #include <QPainterPath> #include <QRandomGenerator> QVariant myColorInterpolator(const doubleColor &start, const doubleColor &end, qreal progress) { auto fr = start.fristColor.red() + ((end.fristColor.red() - start.fristColor.red()) * progress); auto fg = start.fristColor.green() + ((end.fristColor.green() - start.fristColor.green()) * progress); auto fb = start.fristColor.blue() + ((end.fristColor.blue() - start.fristColor.blue()) * progress); auto sr = start.secondColor.red() + ((end.secondColor.red() - start.secondColor.red()) * progress); auto sg = start.secondColor.green() + ((end.secondColor.green() - start.secondColor.green()) * progress); auto sb = start.secondColor.blue() + ((end.secondColor.blue() - start.secondColor.blue()) * progress); return QVariant::fromValue(doubleColor(QColor(fr,fg,fb),QColor(sr,sg,sb))); } QColor getRandomColor() { return QColor(QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255)); } ColorGradientRoundedButton::ColorGradientRoundedButton(QWidget *parent) : QAbstractButton(parent) { qRegisterAnimationInterpolator<doubleColor>(myColorInterpolator); startColor = doubleColor(getRandomColor(),getRandomColor()); endColor = doubleColor(getRandomColor(),getRandomColor()); currentColor = startColor; this->setMinimumSize(180,50); setMouseTracking(true); QGraphicsDropShadowEffect * effect = new QGraphicsDropShadowEffect(this); setGraphicsEffect(effect); effect->setOffset(0,0); effect->setBlurRadius(25); effect->setColor(Qt::black); animation = new QPropertyAnimation(this, "currentColor"); animation->setDuration(400); connect(animation,&QPropertyAnimation::valueChanged,this,&ColorGradientRoundedButton::onValueChanged); } ColorGradientRoundedButton::~ColorGradientRoundedButton() { } void ColorGradientRoundedButton::onValueChanged(const QVariant &value) { update(); } void ColorGradientRoundedButton::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing,true); auto rect = event->rect(); QPainterPath path; path.addRoundedRect(rect,25,25); painter.setClipPath(path); painter.drawRect(rect); QLinearGradient linearGradient(rect.topLeft(),rect.topRight()); linearGradient.setColorAt(0,currentColor.fristColor); linearGradient.setColorAt(1,currentColor.secondColor); painter.fillRect(rect,linearGradient); 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::enterEvent(QEnterEvent *event) { if(animation->state() == QAbstractAnimation::Running) { animation->stop(); } animation->setStartValue(QVariant::fromValue(currentColor)); animation->setEndValue(QVariant::fromValue(endColor)); animation->start(); QWidget::enterEvent(event); } void ColorGradientRoundedButton::leaveEvent(QEvent *event) { if(animation->state() == QAbstractAnimation::Running) { animation->stop(); } animation->setStartValue(QVariant::fromValue(currentColor)); animation->setEndValue(QVariant::fromValue(startColor)); animation->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动画框架:QVariantAnimation
这篇关于Qt编写自定义控件:彩色渐变圆角按钮之一的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)