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();
}
}
}