QGraphicsView实现简易地图17『涟漪效果』

前文链接:QGraphicsView实现简易地图16『爆炸效果』
模仿水波荡漾时的涟漪效果,参考了echarts中的散点图
支持设置散点大小、颜色、涟漪线条宽度。
动态演示效果

静态展示图片
在这里插入图片描述
核心代码

#pragma once
#include "../AbstractGeoItem.h"
#include "DataStruct/GeoData.h"

/*
 * 散点效果-静态
 */

class EffectScatterItem : public AbstractGeoItem
{
public:
	explicit EffectScatterItem(const GeoCoord &geoCoord, int radius, QGraphicsItem *parent = nullptr);
	~EffectScatterItem();

	// 设置百分比(值:0-1)
	void setPercent(double percent);
	// 获取百分比
	double percent();
	// 设置颜色
	void setColor(QColor color);
	// 设置涟漪线宽
	void setRippleWidth(double width);

protected:
	virtual QRectF boundingRect() const override;
	virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;

private:
	int m_radius;			// 半径(单位:像素)
	double m_percent;		// 每条涟漪扩散百分比
	double m_ripplesWidth;	// 涟漪线宽
	QColor m_color;			// 颜色
};
#include "EffectScatterItem.h"
#include <QPainter>

EffectScatterItem::EffectScatterItem(const GeoCoord &geoCoord, int radius, QGraphicsItem *parent /*= nullptr*/)
	: AbstractGeoItem(parent)
{
	setZValue(302);
	setGeoPos(geoCoord.lon, geoCoord.lat);
	m_radius = radius;
	m_percent = 0;
	m_ripplesWidth = 1.5;
	m_color = Qt::white;
}

EffectScatterItem::~EffectScatterItem()
{

}

void EffectScatterItem::setPercent(double percent)
{
	m_percent = percent;
	update();
}

double EffectScatterItem::percent()
{
	return m_percent;
}

void EffectScatterItem::setColor(QColor color)
{
	m_color = color;
	update();
}

void EffectScatterItem::setRippleWidth(double width)
{
	m_ripplesWidth = width;
	update();
}

QRectF EffectScatterItem::boundingRect() const
{
	return QRectF(-m_radius, -m_radius, 2 * m_radius, 2 * m_radius);
}

void EffectScatterItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
	painter->setPen(Qt::NoPen);
	painter->setBrush(m_color);
	painter->setRenderHint(QPainter::Antialiasing);
	painter->drawEllipse(QPointF(0, 0), m_radius * 0.4, m_radius * 0.4);

	painter->setBrush(Qt::NoBrush);

	for (int i = 1; i <= 3; ++i)
	{
		QColor color = m_color;
		color.setAlphaF((4 - i - m_percent) / 3);
		painter->setPen(QPen(color, m_ripplesWidth));
		
		double radius = m_radius * (0.4 + (i - 1 + m_percent) * 0.2);
		painter->drawEllipse(QPointF(0, 0), radius, radius);
	}
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值