Qt自绘控件-IOS风格开关按钮

Qt自绘控件-IOS风格开关按钮,带有简单动画,还可以显示文字

#include "SwitchButton.h"

SwitchButton::SwitchButton(QWidget *parent)
	: QWidget(parent)
	, m_bChecked(false)
	, m_bShowText(true)
{
	this->setMinimumSize(30, 20);

	QFont font;
	font.setFamily("Consolas");
	font.setPointSize(15);
	this->setFont(font);

	m_timeLine.setDuration(200);
	m_timeLine.setUpdateInterval(10);
	m_timeLine.setCurveShape(QTimeLine::LinearCurve);
	connect(&m_timeLine, &QTimeLine::valueChanged, this, [=](qreal value) {

		m_curPos.setX((m_onPos.x() - m_offPos.x()) * value + m_offPos.x());
		m_curPos.setY((m_onPos.y() - m_offPos.y()) * value + m_offPos.y());

		update();
	});
}

SwitchButton::~SwitchButton()
{
}

QSize SwitchButton::sizeHint() const
{
	return QSize(60, 30);
}

void SwitchButton::resizeEvent(QResizeEvent *event)
{
	QRect rect;
	rect.setWidth(this->geometry().width() - 1);
	rect.setHeight(this->geometry().height() - 1);

	int radius = rect.height() / 2.0;

	m_onPos.setX(rect.width() - radius);
	m_onPos.setY(rect.height() * 0.5);

	m_offPos.setX(radius);
	m_offPos.setY(rect.height() * 0.5);

	if (m_bChecked)
	{
		m_curPos = m_onPos;
	}
	else
	{
		m_curPos = m_offPos;
	}
}

void SwitchButton::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);

	QRect rect;
	rect.setWidth(this->geometry().width() - 1);
	rect.setHeight(this->geometry().height() - 1);

	int radius = rect.height() / 2.0;

	painter.setPen(Qt::NoPen);
	if (m_bChecked)
	{
		painter.setBrush(QBrush(QColor(0, 255, 0)));
	}
	else
	{
		painter.setBrush(QBrush(QColor(200, 200, 200)));
	}
	painter.drawEllipse(QPoint(radius, rect.height() * 0.5), radius, radius);
	painter.drawEllipse(QPoint(rect.width() - radius, rect.height() * 0.5), radius, radius);
	painter.drawRect(radius, 0, rect.width() - radius * 2, rect.height());

	if (m_bShowText)
	{
		painter.setPen(QPen(QColor(255, 255, 255)));
		if (m_bChecked)
		{
			painter.drawText(QRect(0, 0, rect.width() * 0.5, rect.height()), "ON", QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
		}
		else
		{
			painter.drawText(QRect(rect.width() * 0.5, 0, rect.width() * 0.5, rect.height()), "OFF", QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
		}
	}

	painter.setPen(Qt::NoPen);
	painter.setBrush(QBrush(QColor(255, 255, 255)));
	if (m_bChecked)
	{
		int circleRadius = radius - 3;
		painter.drawEllipse(m_curPos, circleRadius, circleRadius);
	}
	else
	{
		int circleRadius = radius - 3;
		painter.drawEllipse(m_curPos, circleRadius, circleRadius);
	}
}

void SwitchButton::mousePressEvent(QMouseEvent *event)
{
	
}

void SwitchButton::mouseMoveEvent(QMouseEvent *event)
{

}

void SwitchButton::mouseReleaseEvent(QMouseEvent *event)
{
	if (m_timeLine.state() != QTimeLine::Running)
	{
		m_bChecked = !m_bChecked;

		if (m_bChecked)
		{
			m_timeLine.setDirection(QTimeLine::Forward);
			m_timeLine.start();
		}
		else
		{
			m_timeLine.setDirection(QTimeLine::Backward);
			m_timeLine.start();
		}
	}
}

完整工程下载:

https://download.csdn.net/download/tth0225/20125857

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值