Qt自定义控件4(流光动态渐变边框)

是一个基于Qt框架的自定义QFrame控件,用于创建具有动态渐变边框效果的可视化组件。该控件实现了圆角边框、背景色设置和动态旋转渐变效果,通过QTimer定时刷新界面实现动画效果。主要功能包括设置背景颜色、边框圆角半径、动态渐变颜色,并支持抗锯齿渲染。该组件通过重写paintEvent实现自定义绘制,使用QPainterPath创建圆角矩形区域,并利用QConicalGradient实现旋转渐变效果。

DynamicBorderFrame.h

#ifndef DYNAMICBORDERFRAME_H
#define DYNAMICBORDERFRAME_H
#include <QWidget>
#include <QFrame>
#include <QPainter>
#include <QPainterPath>
#include <QTimer>
#include <QFont>
#include <QPixmap>
#include <QColor>
#include <QConicalGradient>
#include <QMouseEvent>
#include <QPushButton>
#include <QRegularExpression>
#include <QBrush>
#include <QLayout>

class DynamicBorderFrame : public QFrame
{
    Q_OBJECT

public:
    DynamicBorderFrame(QWidget* parent = Q_NULLPTR);
    ~DynamicBorderFrame();

    void setBackgroundColor(const QColor& bkcolor);
    void setBorderRadius(int radius_);
    int getBorderRadius();
    void setDynamicColor(const QBrush& dycolor1 = Qt::cyan, const QBrush& dycolor2 = Qt::cyan);

protected:
    void paintEvent(QPaintEvent* event) override;
    void showEvent(QShowEvent* event) override;

private:
    int angle = 0;
    QTimer* timer = Q_NULLPTR;
    int timeInterval = 10;
    QColor backgroundcolor = QColor(0, 0, 0, 0);
    int radius = 0;
    QBrush dynamic_color[2] = {Qt::cyan, Qt::cyan};

    void setStyleSheet(const QString& style);
};

#endif // DYNAMICBORDERFRAME_H

 DynamicBorderFrame.cpp

#include "DynamicBorderFrame.h"

DynamicBorderFrame::DynamicBorderFrame(QWidget* parent)
    : QFrame(parent), timer(new QTimer(this))
{
    timer->setInterval(timeInterval);
    connect(timer, &QTimer::timeout, this, [=] { update(); });
}

DynamicBorderFrame::~DynamicBorderFrame()
{
    delete timer;
}

void DynamicBorderFrame::setBackgroundColor(const QColor& bkcolor)
{
    backgroundcolor = bkcolor;
    setStyleSheet("background-color:rgba(" +
                  QString::number(bkcolor.red()) + "," +
                  QString::number(bkcolor.green()) + "," +
                  QString::number(bkcolor.blue()) + "," +
                  QString::number(bkcolor.alpha()) + ");");
}

void DynamicBorderFrame::setBorderRadius(int radius_)
{
    radius = radius_;
    setStyleSheet("*{border-radius:" + QString::number(radius_) + "px;" +
                  "background-color:rgba(" +
                  QString::number(backgroundcolor.red()) + "," +
                  QString::number(backgroundcolor.green()) + "," +
                  QString::number(backgroundcolor.blue()) + "," +
                  QString::number(backgroundcolor.alpha()) + ");}");
}

void DynamicBorderFrame::setStyleSheet(const QString& style)
{
    QFrame::setStyleSheet(style);
    static QRegularExpression re("border-radius:\\s*(\\d+)px");
    re.match(styleSheet()).hasMatch();
    radius = re.match(styleSheet()).captured(1).toInt();
}

void DynamicBorderFrame::paintEvent(QPaintEvent* event)
{
    QFrame::paintEvent(event);

    QPainterPath path;
    path.addRoundedRect(0, 0, width(), height(), radius, radius);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.setClipPath(path);
    painter.translate(width() / 2, height() / 2);
    painter.setBrush(dynamic_color[0]);
    painter.rotate(angle++);
    painter.drawRect(0, 0, width(), height());

    painter.setBrush(dynamic_color[1]);
    painter.rotate(180);
    painter.drawRect(0, 0, width(), height());

    if (angle == 360)
        angle = 0;
}

void DynamicBorderFrame::showEvent(QShowEvent* event)
{
    QFrame::showEvent(event);
    timer->start();
}

int DynamicBorderFrame::getBorderRadius()
{
    static QRegularExpression re("border-radius:\\s*(\\d+)px");
    re.match(styleSheet()).hasMatch();
    radius = re.match(styleSheet()).captured(1).toInt();
    return radius;
}

void DynamicBorderFrame::setDynamicColor(const QBrush& dycolor1, const QBrush& dycolor2)
{
    dynamic_color[0] = dycolor1;
    dynamic_color[1] = dycolor2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值