tianzhendong
2 years ago
commit
8c3899ac31
7 changed files with 557 additions and 0 deletions
@ -0,0 +1,387 @@ |
|||
#include "SwitchButton.h" |
|||
#include <QPainter> |
|||
#include <QPainterPath> |
|||
|
|||
SwitchButton::SwitchButton(QWidget *parent) : QWidget(parent) |
|||
{ |
|||
m_space = 2; |
|||
m_radius = 5; |
|||
m_checked = false; |
|||
m_showText = true; |
|||
m_showText = false; |
|||
m_animation = true; |
|||
// m_bgColorOn = QColor(21, 156, 119);
|
|||
m_bgColorOn = QColor(0x4e96fb); |
|||
m_bgColorOff = QColor(111, 122, 126); |
|||
m_sliderColorOn = QColor(255, 255, 255); |
|||
m_sliderColorOff = QColor(255, 255, 255); |
|||
m_textColor = QColor(255, 255, 255); |
|||
m_textOn = tr("Yes"); |
|||
m_textOff = tr("No"); |
|||
m_step = 0; |
|||
m_startX = 0; |
|||
m_endX = 0; |
|||
// m_timer = new QTimer(this);
|
|||
m_timer = std::make_shared<QTimer>(this); |
|||
m_timer.get()->setInterval(30); |
|||
connect(m_timer.get(), SIGNAL(timeout()), this, SLOT(updateValue())); |
|||
} |
|||
|
|||
void SwitchButton::drawBackGround(QPainter *painter) |
|||
{ |
|||
painter->save(); |
|||
painter->setPen(Qt::NoPen); |
|||
QColor bgColor = m_checked ? m_bgColorOn : m_bgColorOff; |
|||
if (isEnabled()) |
|||
{ |
|||
bgColor.setAlpha(255); |
|||
} |
|||
painter->setBrush(bgColor); |
|||
QRect rect(0, 0, width(), height()); |
|||
int side = qMin(width(), height()); |
|||
//左侧半圆
|
|||
QPainterPath path1; |
|||
path1.addEllipse(rect.x(), rect.y(), side, side); |
|||
//右侧半圆
|
|||
QPainterPath path2; |
|||
path2.addEllipse(rect.width() - side, rect.y(), side, side); |
|||
//中间的矩形
|
|||
QPainterPath path3; |
|||
path3.addRect(rect.x() + side / 2, rect.y(), rect.width() - side, height()); |
|||
QPainterPath path = path1 + path2 + path3; |
|||
painter->drawPath(path); |
|||
//绘制文本
|
|||
//滑块半径
|
|||
int sliderWidth = qMin(height(), width()) - m_space * 2 - 5; |
|||
if (m_checked) |
|||
{ |
|||
QRect textRect(0, 0, width() - sliderWidth, height()); |
|||
painter->setPen(QPen(m_textColor)); |
|||
painter->drawText(textRect, Qt::AlignCenter, m_textOn); |
|||
} |
|||
else |
|||
{ |
|||
QRect textRect(sliderWidth, 0, width() - sliderWidth, height()); |
|||
painter->setPen(QPen(m_textColor)); |
|||
painter->drawText(textRect, Qt::AlignCenter, m_textOff); |
|||
} |
|||
painter->restore(); |
|||
} |
|||
|
|||
void SwitchButton::drawSlider(QPainter *painter) |
|||
{ |
|||
painter->save(); |
|||
painter->setPen(Qt::NoPen); |
|||
QColor color = m_checked ? m_sliderColorOn : m_sliderColorOff; |
|||
painter->setBrush(QBrush(color)); |
|||
int sliderWidth = qMin(width(), height()) - m_space * 2; |
|||
QRect rect(m_space + m_startX, m_space, sliderWidth, sliderWidth); |
|||
painter->drawEllipse(rect); |
|||
painter->restore(); |
|||
} |
|||
|
|||
void SwitchButton::paintEvent(QPaintEvent *) |
|||
{ |
|||
//启用反锯齿
|
|||
QPainter painter(this); |
|||
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); |
|||
//绘制背景
|
|||
drawBackGround(&painter); |
|||
//绘制滑块
|
|||
drawSlider(&painter); |
|||
} |
|||
|
|||
void SwitchButton::mousePressEvent(QMouseEvent *ev) |
|||
{ |
|||
Q_UNUSED(ev) |
|||
m_checked = !m_checked; |
|||
emit checkedChanged(m_checked); |
|||
//计算步长
|
|||
m_step = width() / 10; |
|||
//计算滑块X轴终点坐标
|
|||
if (m_checked) |
|||
{ |
|||
m_endX = width() - height(); |
|||
} |
|||
else |
|||
{ |
|||
m_endX = 0; |
|||
} |
|||
//判断是否使用动画
|
|||
if (m_animation) |
|||
{ |
|||
m_timer.get()->start(); |
|||
} |
|||
else |
|||
{ |
|||
m_startX = m_endX; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::updateValue() |
|||
{ |
|||
if (m_checked) |
|||
{ |
|||
if (m_startX < m_endX) |
|||
{ |
|||
m_startX += m_step; |
|||
} |
|||
else |
|||
{ |
|||
m_startX = m_endX; |
|||
m_timer.get()->stop(); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (m_startX > m_endX) |
|||
{ |
|||
m_startX -= m_step; |
|||
} |
|||
else |
|||
{ |
|||
m_startX = m_endX; |
|||
m_timer.get()->stop(); |
|||
} |
|||
} |
|||
update(); |
|||
} |
|||
|
|||
int SwitchButton::space() const |
|||
{ |
|||
return m_space; |
|||
} |
|||
|
|||
int SwitchButton::radius() const |
|||
{ |
|||
return m_radius; |
|||
} |
|||
|
|||
bool SwitchButton::checked() const |
|||
{ |
|||
return m_checked; |
|||
} |
|||
|
|||
bool SwitchButton::showText() const |
|||
{ |
|||
return m_showText; |
|||
} |
|||
|
|||
bool SwitchButton::showCircel() const |
|||
{ |
|||
return m_showCircle; |
|||
} |
|||
|
|||
bool SwitchButton::animation() const |
|||
{ |
|||
return m_animation; |
|||
} |
|||
|
|||
QColor SwitchButton::bgColorOn() const |
|||
{ |
|||
return m_bgColorOn; |
|||
} |
|||
|
|||
QColor SwitchButton::bgColorOff() const |
|||
{ |
|||
return m_bgColorOff; |
|||
} |
|||
|
|||
QColor SwitchButton::sliderColorOn() const |
|||
{ |
|||
return m_sliderColorOn; |
|||
} |
|||
|
|||
QColor SwitchButton::sliderColorOff() const |
|||
{ |
|||
return m_sliderColorOff; |
|||
} |
|||
|
|||
QColor SwitchButton::textColor() const |
|||
{ |
|||
return m_textColor; |
|||
} |
|||
|
|||
QString SwitchButton::textOn() const |
|||
{ |
|||
return m_textOn; |
|||
} |
|||
|
|||
QString SwitchButton::textOff() const |
|||
{ |
|||
return m_textOff; |
|||
} |
|||
|
|||
int SwitchButton::step() const |
|||
{ |
|||
return m_step; |
|||
} |
|||
|
|||
int SwitchButton::startX() const |
|||
{ |
|||
return m_startX; |
|||
} |
|||
|
|||
int SwitchButton::endX() const |
|||
{ |
|||
return m_endX; |
|||
} |
|||
|
|||
void SwitchButton::setSpace(int space) |
|||
{ |
|||
if (m_space != space) |
|||
{ |
|||
m_space = space; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setRadius(int radius) |
|||
{ |
|||
if (m_radius != radius) |
|||
{ |
|||
m_radius = radius; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setChecked(bool checked) |
|||
{ |
|||
if (m_checked != checked) |
|||
{ |
|||
m_checked = checked; |
|||
update(); |
|||
} |
|||
if (m_checked) |
|||
{ |
|||
//计算步长
|
|||
m_step = width() / 10; |
|||
m_endX = width() - height(); |
|||
m_startX = m_endX; |
|||
update(); |
|||
} |
|||
else |
|||
{ |
|||
m_endX = 0; |
|||
} |
|||
// //判断是否使用动画
|
|||
// if (m_animation)
|
|||
// {
|
|||
// m_timer.get()->start();
|
|||
// }
|
|||
// else
|
|||
// {
|
|||
// m_startX = m_endX;
|
|||
// update();
|
|||
// }
|
|||
} |
|||
|
|||
void SwitchButton::setShowText(bool show) |
|||
{ |
|||
if (m_showText != show) |
|||
{ |
|||
m_showText = show; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setShowCircle(bool show) |
|||
{ |
|||
if (m_showCircle != show) |
|||
{ |
|||
m_showCircle = show; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setAnimation(bool ok) |
|||
{ |
|||
if (m_animation != ok) |
|||
{ |
|||
m_animation = ok; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setBgColorOn(const QColor &color) |
|||
{ |
|||
if (m_bgColorOn != color) |
|||
{ |
|||
m_bgColorOn = color; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setBgColorOff(const QColor &color) |
|||
{ |
|||
if (m_bgColorOff != color) |
|||
{ |
|||
m_bgColorOff = color; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setSliderColorOn(const QColor &color) |
|||
{ |
|||
if (m_sliderColorOn != color) |
|||
{ |
|||
m_sliderColorOn = color; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setSliderColorOff(const QColor &color) |
|||
{ |
|||
if (m_sliderColorOff != color) |
|||
{ |
|||
m_sliderColorOff = color; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setTextColor(const QColor &color) |
|||
{ |
|||
if (m_textColor != color) |
|||
{ |
|||
m_textColor = color; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setTextOn(const QString &text) |
|||
{ |
|||
if (m_textOn != text) |
|||
{ |
|||
m_textOn = text; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setTextOff(const QString &text) |
|||
{ |
|||
if (m_textOff != text) |
|||
{ |
|||
m_textOff = text; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
#if 0 |
|||
void SwitchButton::setStep(int step) |
|||
{ |
|||
if (m_step != step) |
|||
{ |
|||
m_step = step; |
|||
update(); |
|||
} |
|||
} |
|||
|
|||
void SwitchButton::setStartX(int startX) |
|||
{ |
|||
} |
|||
|
|||
void SwitchButton::setEndX(int endX) |
|||
{ |
|||
} |
|||
#endif |
Binary file not shown.
@ -0,0 +1,126 @@ |
|||
#ifndef SWITCHBUTTON_H |
|||
#define SWITCHBUTTON_H |
|||
|
|||
#include "SwitchButton_global.h" |
|||
|
|||
#include <QWidget> |
|||
#include <QTimer> |
|||
#include <QColor> |
|||
#include <memory> |
|||
|
|||
class SWITCHBUTTON_EXPORT SwitchButton : public QWidget |
|||
{ |
|||
Q_OBJECT |
|||
// Q_PROPERTY(int m_space READ space WRITE setSpace)
|
|||
// Q_PROPERTY(int m_radius READ radius WRITE setRadius)
|
|||
// Q_PROPERTY(bool m_checked READ checked WRITE setChecked)
|
|||
// Q_PROPERTY(bool m_showText READ showText WRITE setShowText)
|
|||
// Q_PROPERTY(bool m_showCircle READ showCircel WRITE setShowCircle)
|
|||
// Q_PROPERTY(bool m_animation READ animation WRITE setAnimation)
|
|||
|
|||
// Q_PROPERTY(QColor m_bgColorOn READ bgColorOn WRITE setBgColorOn)
|
|||
// Q_PROPERTY(QColor m_bgColorOff READ bgColorOff WRITE setBgColorOff)
|
|||
// Q_PROPERTY(QColor m_sliderColorOn READ sliderColorOn WRITE setSliderColorOn)
|
|||
// Q_PROPERTY(QColor m_sliderColorOff READ sliderColorOff WRITE setSliderColorOff)
|
|||
// Q_PROPERTY(QColor m_textColor READ textColor WRITE setTextColor)
|
|||
|
|||
// Q_PROPERTY(QString m_textOn READ textOn WRITE setTextOn)
|
|||
// Q_PROPERTY(QString m_textOff READ textOff WRITE setTextOff)
|
|||
|
|||
// Q_PROPERTY(int m_step READ step WRITE setStep)
|
|||
// Q_PROPERTY(int m_startX READ startX WRITE setStartX)
|
|||
// Q_PROPERTY(int m_endX READ endX WRITE setEndX)
|
|||
|
|||
public: |
|||
explicit SwitchButton(QWidget *parent = 0); |
|||
|
|||
signals: |
|||
// void statusChanged(bool checked);
|
|||
void checkedChanged(bool checked); |
|||
|
|||
public slots: |
|||
|
|||
private slots: |
|||
void updateValue(); |
|||
|
|||
private: |
|||
void drawBackGround(QPainter *painter); |
|||
void drawSlider(QPainter *painter); |
|||
|
|||
protected: |
|||
void paintEvent(QPaintEvent *ev); |
|||
void mousePressEvent(QMouseEvent *ev); |
|||
|
|||
private: |
|||
int m_space; //滑块距离边界距离
|
|||
int m_radius; //圆角角度
|
|||
|
|||
bool m_checked; //是否选中
|
|||
bool m_showText; //是否显示文字
|
|||
bool m_showCircle; //是否显示圆圈
|
|||
bool m_animation; //是否使用动画
|
|||
|
|||
QColor m_bgColorOn; //打开时候的背景色
|
|||
QColor m_bgColorOff; //关闭时候的背景色
|
|||
QColor m_sliderColorOn; //打开时候滑块颜色
|
|||
QColor m_sliderColorOff; //关闭时候滑块颜色
|
|||
QColor m_textColor; //文字颜色
|
|||
|
|||
QString m_textOn; //打开时候的文字
|
|||
QString m_textOff; //关闭时候的文字
|
|||
|
|||
// QTimer *m_timer; //动画定时器
|
|||
std::shared_ptr<QTimer> m_timer; |
|||
int m_step; //动画步长
|
|||
int m_startX; //滑块开始X轴坐标
|
|||
int m_endX; //滑块结束X轴坐标
|
|||
|
|||
public: |
|||
int space() const; |
|||
int radius() const; |
|||
bool checked() const; |
|||
bool showText() const; |
|||
bool showCircel() const; |
|||
bool animation() const; |
|||
|
|||
QColor bgColorOn() const; |
|||
QColor bgColorOff() const; |
|||
QColor sliderColorOn() const; |
|||
QColor sliderColorOff() const; |
|||
QColor textColor() const; |
|||
|
|||
QString textOn() const; |
|||
QString textOff() const; |
|||
|
|||
int step() const; |
|||
int startX() const; |
|||
int endX() const; |
|||
|
|||
|
|||
public Q_SLOTS: |
|||
void setSpace(int space); |
|||
void setRadius(int radius); |
|||
void setChecked(bool checked); |
|||
void setShowText(bool show); |
|||
void setShowCircle(bool show); |
|||
void setAnimation(bool ok); |
|||
|
|||
void setBgColorOn(const QColor &color); |
|||
void setBgColorOff(const QColor &color); |
|||
void setSliderColorOn(const QColor &color); |
|||
void setSliderColorOff(const QColor &color); |
|||
void setTextColor(const QColor &color); |
|||
|
|||
void setTextOn(const QString &text); |
|||
void setTextOff(const QString &text); |
|||
|
|||
// void setStep(int step);
|
|||
// void setStartX(int startX);
|
|||
// void setEndX(int endX);
|
|||
|
|||
|
|||
}; |
|||
|
|||
|
|||
|
|||
#endif // SWITCHBUTTON_H
|
@ -0,0 +1,23 @@ |
|||
QT += widgets |
|||
|
|||
TEMPLATE = lib |
|||
DEFINES += SWITCHBUTTON_LIBRARY |
|||
|
|||
CONFIG += c++17 |
|||
|
|||
# You can make your code fail to compile if it uses deprecated APIs. |
|||
# In order to do so, uncomment the following line. |
|||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 |
|||
|
|||
SOURCES += \ |
|||
SwitchButton.cpp |
|||
|
|||
HEADERS += \ |
|||
SwitchButton_global.h \ |
|||
SwitchButton.h |
|||
|
|||
# Default rules for deployment. |
|||
unix { |
|||
target.path = /usr/lib |
|||
} |
|||
!isEmpty(target.path): INSTALLS += target |
@ -0,0 +1,12 @@ |
|||
#ifndef SWITCHBUTTON_GLOBAL_H |
|||
#define SWITCHBUTTON_GLOBAL_H |
|||
|
|||
#include <QtCore/qglobal.h> |
|||
|
|||
#if defined(SWITCHBUTTON_LIBRARY) |
|||
# define SWITCHBUTTON_EXPORT Q_DECL_EXPORT |
|||
#else |
|||
# define SWITCHBUTTON_EXPORT Q_DECL_IMPORT |
|||
#endif |
|||
|
|||
#endif // SWITCHBUTTON_GLOBAL_H
|
Binary file not shown.
@ -0,0 +1,9 @@ |
|||
INCLUDEPATH += $$PWD/ |
|||
|
|||
#SOURCES += \ |
|||
# $$PWD/SwitchButton.cpp |
|||
|
|||
HEADERS += \ |
|||
$$PWD/SwitchButton.h |
|||
|
|||
LIBS += -L. SwitchButton |
Loading…
Reference in new issue