在项目中有时候会用到类似开关的控件, 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进行提升,输入封装的类名和头文件所在目录后,点击添加,添加完成,点击提升就可以