qt更改背景颜色的动画

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include <QPainter>
#include <QPropertyAnimation>
#include <QPushButton>
#include <QLineEdit>


class Widget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int Gradient_Position READ Gradient_Position WRITE setGradient_Position)
    Q_PROPERTY(qreal Circle_Ratio READ Circle_Ratio WRITE setCircle_Ratio)
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QPropertyAnimation *animation;
    QPropertyAnimation* animation2;
    QPushButton *button;
    QLineEdit *lineEdit;

    void forward();
    void backward();

    int Gradient_Position() const;
    void setGradient_Position(const int&value);

    qreal Circle_Ratio() const;
    void setCircle_Ratio(const qreal&value);
protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

private:
    int m_Gradient_Position; 
    QColor Global_Color = QColor(255, 255, 255 , 255); 
    QString color_str;
    qreal m_Circle_Ratio = 0.0; 
    bool m_isForward = true; 
    
};
#endif // WIDGET_H
cpp 复制代码
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent) {
    this->resize(1440, 880);

    animation = new QPropertyAnimation(this, "Gradient_Position");
    animation->setDuration(5000);
    animation->setStartValue(0);
    animation->setEndValue(360);
    animation->start();

    connect(animation, &QPropertyAnimation::finished, this, [this] {
        animation->start();
    });

    animation2 = new QPropertyAnimation(this, "Circle_Ratio");
    animation2->setDuration(1000);
    animation2->setStartValue(m_Circle_Ratio);
    animation2->setEndValue(1.0);

    button = new QPushButton(this);
    button->setText("更改背景颜色");
    button->setGeometry(20, 20, 100, 30);
    
    lineEdit = new QLineEdit(this);
    lineEdit->setGeometry(130, 20, 100, 30);

    connect(lineEdit, &QLineEdit::textChanged, this, [this](const QString &text) {
        color_str = text;
        update();
    });

    connect(button, &QPushButton::clicked, this, [this] {
        if (m_isForward) {
            this->forward();
            m_isForward = false;
        } else {
            this->backward();
            m_isForward = true;
        }
    });
}

Widget::~Widget() {}

void Widget::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    int w = this->width();
    int h = this->height();
    int sum = w + h;

    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255, 255, 255, 255)));
    painter.drawRect(0, 0, w, h);
    
    painter.setBrush(QBrush(QColor(0, 0, 0, 255)));
    painter.drawEllipse(button->rect().bottomRight(), int(sum * m_Circle_Ratio), int(sum * m_Circle_Ratio));

    QConicalGradient gradient(w / 2, h, m_Gradient_Position);
    gradient.setColorAt(0, QColor(255, 167, 69, 255));
    gradient.setColorAt(0.125, QColor(254, 134, 159, 255));
    gradient.setColorAt(0.25, QColor(239, 122, 200, 255));
    gradient.setColorAt(0.375, QColor(160, 131, 237, 255));
    gradient.setColorAt(0.5, QColor(67, 174, 255, 255));
    gradient.setColorAt(0.625, QColor(160, 131, 237, 255));
    gradient.setColorAt(0.75, QColor(239, 122, 200, 255));
    gradient.setColorAt(0.875, QColor(254, 134, 159, 255));
    gradient.setColorAt(1, QColor(255, 167, 69, 255));
    painter.setBrush(gradient);

    QFont font;
    font.setPixelSize(h / 5);
    font.setFamily("微软雅黑");
    font.setBold(true);
    painter.setFont(font);
    painter.setPen(QPen(QBrush(gradient), 2));
    painter.drawText(QRect(0, 0, w, h), Qt::AlignCenter, color_str);
}

void Widget::resizeEvent(QResizeEvent *event) {}

void Widget::forward() {
    animation2->setDirection(QAbstractAnimation::Forward);
    animation2->start();
}

void Widget::backward() {
    animation2->setDirection(QAbstractAnimation::Backward);
    animation2->start();
}

int Widget::Gradient_Position() const {
    return m_Gradient_Position;
}

void Widget::setGradient_Position(const int &value) {
    if (m_Gradient_Position == value)
        return;

    m_Gradient_Position = value;
    update();
}

qreal Widget::Circle_Ratio() const {
    return m_Circle_Ratio;
}

void Widget::setCircle_Ratio(const qreal &value) {
    if (m_Circle_Ratio == value)
        return;

    m_Circle_Ratio = value;
    update();
}
cpp 复制代码
  Widget *w=new Widget();
    w->show();
相关推荐
qq_401700415 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
小短腿的代码世界5 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
郝学胜-神的一滴8 小时前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
Hua-Jay11 小时前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
mirror_zAI12 小时前
C++ 仿 QQ 聊天室项目:Qt 客户端 + epoll 服务端 + Reactor 架构(含源码)
c++·qt·架构
Hua-Jay13 小时前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
我在人间贩卖青春14 小时前
重学Qt——对话框和多窗口程序设计
qt
努力努力再努力wz14 小时前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
程序leo源1 天前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#
我在人间贩卖青春1 天前
重学Qt——事件处理
qt