Qt自定义控件(9)——径向渐变QRadialGradient、圆锥渐变QConicalGradient
径向渐变QRadialGradient
QRadialGradient
是 Qt 框架中用于创建径向渐变的类,它能实现从中心点向外辐射的圆形渐变效果。径向渐变常用于模拟光源、创建立体感或设计现代 UI 元素。以下是其详细介绍与使用方法:
1. 基本概念
径向渐变以 中心点、焦点 和 半径 定义,颜色从焦点向圆周边缘平滑过渡。常见应用场景包括:
- 模拟球体光照效果
- 创建按钮、图标等 UI 元素的立体效果
- 设计数据可视化中的强调点
2. 构造函数
// 标准构造函数(焦点与中心重合)
QRadialGradient(const QPointF ¢er, qreal radius);// 带焦点的构造函数(可创建偏移光源效果)
QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint);// 使用坐标值的构造函数
QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
- 参数说明:
center
:中心点坐标(渐变的圆心)radius
:半径(控制渐变的范围)focalPoint
:焦点(颜色起始点,通常用于模拟光源位置)
3. 核心方法
设置渐变颜色
void setColorAt(qreal position, const QColor &color);
position
:范围 [0.0, 1.0],表示从焦点(0.0)到圆周边缘(1.0)的位置color
:对应位置的颜色
设置渐变模式
控制超出半径范围的区域如何填充:
void setSpread(QGradient::Spread spread);
QGradient::PadSpread
(默认):超出部分用边缘颜色填充QGradient::RepeatSpread
:重复渐变图案QGradient::ReflectSpread
:镜像反射渐变图案
设置焦点位置
void setFocalPoint(const QPointF &focalPoint);
void setFocalPoint(qreal fx, qreal fy);
焦点决定了颜色的起始位置,常用于模拟光源偏移效果。
4. 使用示例
示例 1:标准径向渐变(焦点与中心重合)
QPainter painter(this);// 创建径向渐变(中心点(150,150),半径100)
QRadialGradient gradient(150, 150, 100);
gradient.setColorAt(0.0, Qt::white); // 中心点白色
gradient.setColorAt(1.0, Qt::blue); // 边缘蓝色// 应用渐变到画刷
QBrush brush(gradient);
painter.setBrush(brush);// 绘制填充椭圆
painter.drawEllipse(50, 50, 200, 200);
示例 2:带焦点偏移的径向渐变(模拟光照)
// 创建偏移焦点的径向渐变
QRadialGradient gradient(150, 150, 100, 100, 100); // 焦点位于(100,100)
gradient.setColorAt(0.0, Qt::white); // 焦点处白色(模拟光源)
gradient.setColorAt(1.0, Qt::darkBlue);painter.setBrush(QBrush(gradient));
painter.drawEllipse(50, 50, 200, 200); // 绘制球体效果
示例 3:多色径向渐变
QRadialGradient gradient(150, 350, 100);
gradient.setColorAt(0.0, Qt::red);
gradient.setColorAt(0.5, Qt::yellow);
gradient.setColorAt(1.0, Qt::green);painter.setBrush(QBrush(gradient));
painter.drawEllipse(50, 300, 200, 100);
示例 4:使用 ReflectSpread 模式
QRadialGradient gradient(150, 500, 50);
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(1.0, Qt::black);
gradient.setSpread(QGradient::ReflectSpread); // 镜像反射模式painter.setBrush(QBrush(gradient));
painter.drawRect(50, 450, 200, 100); // 在矩形中应用渐变
5. 高级技巧
技巧 1:创建透明渐变(用于叠加效果)
QRadialGradient gradient(150, 150, 100);
gradient.setColorAt(0.0, QColor(255, 255, 255, 150)); // 半透明白色
gradient.setColorAt(1.0, QColor(255, 255, 255, 0)); // 完全透明painter.setBrush(QBrush(gradient));
painter.drawEllipse(50, 50, 200, 200); // 创建光晕效果
技巧 2:与 QPainterPath 结合绘制复杂形状
QPainterPath path;
path.addRoundedRect(50, 300, 200, 100, 20, 20);QRadialGradient gradient(150, 350, 150); // 半径大于矩形尺寸
gradient.setColorAt(0.0, Qt::cyan);
gradient.setColorAt(1.0, Qt::darkCyan);painter.setBrush(QBrush(gradient));
painter.drawPath(path); // 圆角矩形应用径向渐变
6. 性能注意事项
- 避免过大半径:大范围的径向渐变会增加渲染开销
- 缓存频繁使用的渐变:对于固定的渐变效果,可预先创建并复用
- 谨慎使用透明度:半透明渐变需要额外的合成计算
7. 应用场景
- UI设计:按钮、图标、滑块的高光效果
- 游戏开发:模拟光源、爆炸特效
- 数据可视化:强调重要数据点
- 艺术创作:绘制球体、光晕等效果
通过 QRadialGradient
,你可以轻松创建出具有深度感和立体感的视觉效果,为应用界面增添专业度和现代感。
圆锥渐变QConicalGradient
QConicalGradient
是 Qt 框架中用于创建圆锥渐变的类,它能实现围绕中心点旋转的环形渐变效果。圆锥渐变常用于创建仪表盘、加载指示器、色彩轮或需要360度颜色过渡的场景。以下是其详细介绍与使用方法:
1. 基本概念
圆锥渐变以 中心点 和 起始角度 为基准,颜色沿顺时针方向围绕中心点旋转分布。与线性渐变(直线过渡)和径向渐变(从中心向外辐射)不同,圆锥渐变的颜色变化是 环形的。
2. 构造函数
// 标准构造函数
QConicalGradient(const QPointF ¢er, qreal startAngle);// 使用坐标值的构造函数
QConicalGradient(qreal cx, qreal cy, qreal startAngle);
- 参数说明:
center
:中心点坐标(渐变的旋转中心)startAngle
:起始角度(单位:度),0度指向3点钟方向,正值表示逆时针旋转
3. 核心方法
设置渐变颜色
void setColorAt(qreal position, const QColor &color);
position
:范围 [0.0, 1.0],表示从起始角度开始的顺时针位置(0.0对应起始角度,1.0对应绕一圈后回到起始角度)color
:对应位置的颜色
设置渐变环绕模式
圆锥渐变不支持 Spread
模式,因为颜色会自然环绕一周。
调整起始角度
void setAngle(qreal angle); // 重新设置起始角度
4. 使用示例
示例 1:基本色彩轮(彩虹色)
QPainter painter(this);// 创建圆锥渐变(中心点(150,150),起始角度0度)
QConicalGradient gradient(150, 150, 0);// 设置彩虹色
gradient.setColorAt(0.0, Qt::red);
gradient.setColorAt(1.0/6.0, Qt::yellow);
gradient.setColorAt(2.0/6.0, Qt::green);
gradient.setColorAt(3.0/6.0, Qt::cyan);
gradient.setColorAt(4.0/6.0, Qt::blue);
gradient.setColorAt(5.0/6.0, Qt::magenta);
gradient.setColorAt(1.0, Qt::red); // 闭合色彩环// 应用渐变到画刷
QBrush brush(gradient);
painter.setBrush(brush);// 绘制填充圆形
painter.drawEllipse(50, 50, 200, 200);
示例 2:双色渐变(创建加载指示器)
// 创建圆锥渐变(中心点(150,350),起始角度90度)
QConicalGradient gradient(150, 350, 90);
gradient.setColorAt(0.0, Qt::black);
gradient.setColorAt(0.5, Qt::white);
gradient.setColorAt(1.0, Qt::black);painter.setBrush(QBrush(gradient));
painter.drawEllipse(50, 300, 200, 200);
示例 3:透明度渐变(创建旋转光晕)
// 创建半透明到不透明的圆锥渐变
QConicalGradient gradient(150, 550, 0);
gradient.setColorAt(0.0, QColor(0, 0, 0, 0)); // 完全透明
gradient.setColorAt(0.25, QColor(255, 255, 255, 255)); // 完全不透明
gradient.setColorAt(0.5, QColor(0, 0, 0, 0)); // 完全透明
gradient.setColorAt(0.75, QColor(255, 255, 255, 255)); // 完全不透明
gradient.setColorAt(1.0, QColor(0, 0, 0, 0)); // 完全透明painter.setBrush(QBrush(gradient));
painter.drawEllipse(50, 500, 200, 200);
5. 高级技巧
技巧 1:动态更新起始角度(创建旋转效果)
在动画中不断调整起始角度,可实现旋转效果:
// 在定时器事件中更新起始角度
void MyWidget::timerEvent(QTimerEvent *event) {static qreal angle = 0;angle += 5; // 每次增加5度if (angle >= 360) angle -= 360;QConicalGradient gradient(150, 150, angle);// 设置渐变颜色...update(); // 触发重绘
}
技巧 2:与 QPainterPath 结合绘制不规则形状
QPainterPath path;
path.moveTo(150, 50);
path.lineTo(250, 200);
path.lineTo(150, 350);
path.lineTo(50, 200);
path.closeSubpath();QConicalGradient gradient(150, 200, 0);
gradient.setColorAt(0.0, Qt::red);
gradient.setColorAt(0.5, Qt::blue);
gradient.setColorAt(1.0, Qt::red);painter.setBrush(QBrush(gradient));
painter.drawPath(path); // 在菱形中应用圆锥渐变
6. 性能注意事项
- 避免过度复杂的颜色分布:过多的颜色停止点会增加渲染负担
- 缓存频繁使用的渐变:对于固定的圆锥渐变,可预先创建并复用
- 谨慎使用透明度:半透明渐变需要额外的合成计算
7. 应用场景
- UI设计:色彩选择器、音量控制旋钮、加载指示器
- 游戏开发:角色状态光环、技能冷却指示器
- 数据可视化:方向传感器数据展示、环形图表
- 艺术创作:创建抽象图案、视觉特效
通过 QConicalGradient
,你可以轻松实现各种环形渐变效果,为应用界面增添动感和专业性。