是一个基于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;
}