1、功能描述
通过QPinter绘制虚线,并在虚线上实现流光效果。
2、效果图
3、实现思路
(1)在QLinearGradient上构建色带填充QImage,实现一个颜色表以供查询;
void SteamerLine::CreateColorTable()
{
//颜色表,先绘制到img,再根据坐标取颜色值,可根据需求更改颜色及范围
QLinearGradient Gradient(QPointF(0,0),QPointF(0,100));
Gradient.setColorAt(0,Qt::red);
Gradient.setColorAt(0.333,Qt::green);
Gradient.setColorAt(0.5,Qt::blue);
Gradient.setColorAt(1,Qt::red);
Img = QImage(1,100,QImage::Format_ARGB32);
QPainter imgp(&Img);
imgp.fillRect(Img.rect(),Gradient);
}
(2)采用定时器,定时刷新色带,让查询到的颜色具有流动效果;
//设置定时器更新颜色
QTimer *timer =new QTimer(this);
connect(timer,&QTimer::timeout,this,[this]{
offset++;
offset %= 100;
update();
});
timer->start(50);
(3)求直线与X轴夹角,方便求取线段上的点;
//求直线与X轴夹角,方便求取线段上的点
double theta;
theta = atan2(EndPos.y()-StartPos.y(), EndPos.x()-StartPos.x());
theta = theta * 180 / M_PI;
(4)在一个实部内,根据分片长度获取两端的坐标,从颜色表取对应的颜色值,根据两端颜色设置渐变,然后填充该段采样。
//设置起点下一个线段的起点
double newx1 = StartPos.x() + j* len * cos(theta);
double newy1 = StartPos.y() + j* len * sin(theta);
pt1.setX(newx1);
pt1.setY(newy1);
for(int i=0; i < Dashelen; i+=step)
{
//根据采样长度获取两端的坐标
double x2 = pt1.x() + step * cos(theta);
double y2 = pt1.y() + step * sin(theta);
pt2.setX(x2);
pt2.setY(y2);
//从颜色表取对应的颜色值
QColor color1=Img.pixelColor(0,(i/step+offset)%100);
QColor color2=Img.pixelColor(0,((i+step)/step+offset)%100);
QLinearGradient lg(pt1,pt2);
lg.setColorAt(0,color1);
lg.setColorAt(1,color2);
//根据两端颜色设置渐变,然后填充该段采样
pen.setBrush(lg);
p.setPen(pen);
p.drawLine(pt1,pt2);
//下一次绘制起点
pt1 = pt2;
}
(5)获取每个实部起始点,反复(4)步骤得到流光效果虚线。文章来源:https://www.toymoban.com/news/detail-743806.html
//单条虚线和空格的长度
double len = SpaceLen+Dashelen;
QLineF line(StartPos,EndPos);
//根据总长度计算总共要绘制多少个虚线段
int count = line.length() / len;
//没一个step重新查找绘制一个颜色
int step = 1;
QPointF pt1 = StartPos;
QPointF pt2 = pt1;
for(int j = 0; j < count;j++)
{
//设置起点下一个线段的起点
double newx1 = StartPos.x() + j* len * cos(theta);
double newy1 = StartPos.y() + j* len * sin(theta);
pt1.setX(newx1);
pt1.setY(newy1);
for(int i=0; i < Dashelen; i+=step)
{
//根据采样长度获取两端的坐标
double x2 = pt1.x() + step * cos(theta);
double y2 = pt1.y() + step * sin(theta);
pt2.setX(x2);
pt2.setY(y2);
//从颜色表取对应的颜色值
QColor color1=Img.pixelColor(0,(i/step+offset)%100);
QColor color2=Img.pixelColor(0,((i+step)/step+offset)%100);
QLinearGradient lg(pt1,pt2);
lg.setColorAt(0,color1);
lg.setColorAt(1,color2);
//根据两端颜色设置渐变,然后填充该段采样
pen.setBrush(lg);
p.setPen(pen);
p.drawLine(pt1,pt2);
//下一次绘制起点
pt1 = pt2;
}
}
源代码地址:QPainter实现流光虚线-C++文档类资源-CSDN下载文章来源地址https://www.toymoban.com/news/detail-743806.html
到了这里,关于QPainter实现流光虚线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!