Qt使用QToolButton封装实现开关功能

20 篇文章 2 订阅
2 篇文章 0 订阅
在项目中有时候会用到类似开关的控件, Qt中很多专属控件都需要自己去定义或者绘制,本次是使用QToolButton进行封装成开关的样式。我使用的控件大小是120x64,所以绘制圆的时候坐标需要根据项目的设计增加进行改变。
## 运行结果
## 代码实现
## 项目中使用
1.运行结果:

在这里插入图片描述
在这里插入图片描述
2.代码实现

#pragma once
#include <qtoolbutton.h>
#include <QPainter>
#include <QPaintEvent>
class SwitchButton : public QToolButton
{
	Q_OBJECT
public:
	explicit SwitchButton(QWidget* parent = nullptr);

	void setSwitchText(const QString leftText, const QString rightText);
protected:
	void paintEvent(QPaintEvent* pEvent);

private:
	void drawBackGround(QPainter* painter);

	void drawRound(QPainter* painter);

	void drawText(QPainter* painter);
private:
	QString m_strLeftText;
	QString m_strRightText;
};

#include "SwitchButton.h"
#include <QLinearGradient>
SwitchButton::SwitchButton(QWidget* parent)
	: QToolButton(parent)
	, m_strLeftText("")
	, m_strRightText("")
{
	this->setCheckable(true);
}

void SwitchButton::setSwitchText(const QString text, const QString rightText)
{
	m_strLeftText = text;
	m_strRightText = rightText;
	this->update();
}

void SwitchButton::paintEvent(QPaintEvent* pEvent)
{
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);
	this->drawBackGround(&painter);
	this->drawRound(&painter);
	this->drawText(&painter);
	QToolButton::paintEvent(pEvent);
}

void SwitchButton::drawBackGround(QPainter* painter)
{
	if (this->isChecked())
	{
		painter->setBrush(QBrush(QColor(10, 77, 83)));
		painter->drawRoundedRect(0, 0, 120, 64, 35, 35);
	}
	else
	{
		painter->setBrush(QBrush(QColor(98, 110, 120)));
		painter->drawRoundedRect(0, 0, 120, 64, 35, 35);
	}
}

void SwitchButton::drawRound(QPainter* painter)
{
	painter->setPen(Qt::NoPen);
	if (this->isChecked())
	{
		QLinearGradient lineGradient(8, 8, 48, 48);
		lineGradient.setColorAt(0, QColor(0, 251, 234));
		lineGradient.setColorAt(1, QColor(0, 146, 136));
		lineGradient.setSpread(QGradient::PadSpread);
		painter->setBrush(QBrush(lineGradient));
		painter->drawRoundedRect(8, 8, 48, 48, 24, 24);
	}
	else
	{
		painter->setBrush(QBrush(QColor(220, 222, 224)));
		painter->drawRoundedRect(64, 8, 48, 48, 24, 24);
	}
}

void SwitchButton::drawText(QPainter* painter)
{
	QPen pen;
	pen.setWidth(8);
	painter->setBrush(Qt::NoBrush);
	painter->setFont(QFont("Source Han Sans CN", 18));
	if (this->isChecked())
	{
		pen.setColor(QColor(255, 255, 255));
		painter->setPen(pen);
		painter->drawText(18, 19, 27, 27, Qt::AlignCenter, m_strLeftText);
	}
	else
	{
		pen.setColor(QColor(98, 111, 120));
		painter->setPen(pen);
		painter->drawText(71, 19, 34, 27, Qt::AlignCenter, m_strRightText);
	}
}

3.项目中使用
在这里插入图片描述
将刚才拖进去的QToolButton进行提升,输入封装的类名和头文件所在目录后,点击添加,添加完成,点击提升就可以
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pailugou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值