From 8c3899ac317b85a487f1794949c690aa05413739 Mon Sep 17 00:00:00 2001 From: tianzhendong <1203886034@qq.com> Date: Mon, 15 May 2023 17:46:45 +0800 Subject: [PATCH] finished --- SwitchButton.cpp | 387 ++++++++++++++++++++++++++++++++++++++++++ SwitchButton.dll | Bin 0 -> 33280 bytes SwitchButton.h | 126 ++++++++++++++ SwitchButton.pro | 23 +++ SwitchButton_global.h | 12 ++ libSwitchButton.a | Bin 0 -> 33890 bytes switchbutton.pri | 9 + 7 files changed, 557 insertions(+) create mode 100644 SwitchButton.cpp create mode 100644 SwitchButton.dll create mode 100644 SwitchButton.h create mode 100644 SwitchButton.pro create mode 100644 SwitchButton_global.h create mode 100644 libSwitchButton.a create mode 100644 switchbutton.pri diff --git a/SwitchButton.cpp b/SwitchButton.cpp new file mode 100644 index 0000000..76db8ce --- /dev/null +++ b/SwitchButton.cpp @@ -0,0 +1,387 @@ +#include "SwitchButton.h" +#include +#include + +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(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 diff --git a/SwitchButton.dll b/SwitchButton.dll new file mode 100644 index 0000000000000000000000000000000000000000..37a9da3ddc45bd08ea5c9970daa7872258f3cdba GIT binary patch literal 33280 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 literal 0 HcmV?d00001 diff --git a/SwitchButton.h b/SwitchButton.h new file mode 100644 index 0000000..d388a0a --- /dev/null +++ b/SwitchButton.h @@ -0,0 +1,126 @@ +#ifndef SWITCHBUTTON_H +#define SWITCHBUTTON_H + +#include "SwitchButton_global.h" + +#include +#include +#include +#include + +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 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 diff --git a/SwitchButton.pro b/SwitchButton.pro new file mode 100644 index 0000000..db5b57c --- /dev/null +++ b/SwitchButton.pro @@ -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 diff --git a/SwitchButton_global.h b/SwitchButton_global.h new file mode 100644 index 0000000..8f41d20 --- /dev/null +++ b/SwitchButton_global.h @@ -0,0 +1,12 @@ +#ifndef SWITCHBUTTON_GLOBAL_H +#define SWITCHBUTTON_GLOBAL_H + +#include + +#if defined(SWITCHBUTTON_LIBRARY) +# define SWITCHBUTTON_EXPORT Q_DECL_EXPORT +#else +# define SWITCHBUTTON_EXPORT Q_DECL_IMPORT +#endif + +#endif // SWITCHBUTTON_GLOBAL_H diff --git a/libSwitchButton.a b/libSwitchButton.a new file mode 100644 index 0000000000000000000000000000000000000000..f64fcd7f98a9d4c11910c49d965f184f9943887a GIT binary patch literal 33890 zcmeHQJ&+tn6>hI25Qo7+2rS#Oy!w}A`LwftcV~o3-05uD5~n-qkY!nDwc1_j*1Fp} zcJ~lvpbQi!A~01h2NVGTML;=#j3S^EPy`eqMMU7hfr=s^B%li3o1W?Eo__syW)qKZ zw`<@0^uB&Gult+VKd-0f!0CFov2teORNf3;b-L`8i^XCgpNAg=eVfmhX3Axm;?{%^ z;-(N!d?3WG{|d4DN0RnD5(4ST1xZi+R0yPJ{vv7rOF|&!e=dr5Dc5CZAVKS{a?a**mdNsS)}fz*OLL0WlN(!Kpc zAgz5MY2%;}NZt1(ZB7V*bpL^*x6cZJ^u51IdgqJ~NI(2L(v|z|eq&{Jv)^Cu)S9cS zwRWez))KXqR=rt^|0!zMmsdJowYK0D_5aR!^WPS=T6=Ay#&S4P7Y3#_IIfx(hYNSs z@Va(s{>@c_v%N?Yq8&OC3&z!DP#*ciL<9etVsj zVK7-Trh6;v_m@E*<~9r-OTrZ9#-%%V7y&wqoxZWsYTRozx%3)~mA>j1xZ?-pkTGgK=ZmX}XDa&I?@DfNcc;XUfdaXX%2ryQcFH9|6 z>37?myRMsYFjF!w%crN!iHdmQ5~ksrohzffp%S5G1LY$v=Rv+- zYsPh>IISD6#%>(JGU&e9G}aX=YwMf6)?&BS1C!h8^ye3`kTA|ab>_~%bk>#1&2Ihv zY`t;smG1gxr#Zhky|h?wclxca^CDalTYgZZ&8^fsccJdP?G|fuTGC3G^MUbOZ85@Z zMpD*n&^7_XHMj^-CY`{NT?AINBeLx@ShSO$lpNkf65OF=lAo0PHPy~?mlH}f_$*1@ z=0>yLZ(XggZW@)o*|_xLY_=S@5|%dRBvaO2jLnt<=1w6V&`PJ1KWAXqCE49K~r|wv-LD7?Gj!4G3?j3QQ7PKH4Z* zQzWrZ1)5zn3lJ*R$@QSK?&_mggRXgTsv^7S`CAjs2ipXO-vVv-k9LU3HlVzIxa^<8 zW+xDIjANnjFyO0%e<0s`;fdNSzNs*34;=g=JW>0?LvPes7P#`L-~| zzYFMMM=}2OP&=ui)J~q|#4`}D%h&qI6MlXcW)kOTsU*ih@>+iW5#;Xx!dwmRx#*w5 z2KC4M{3Q?ud4DRORDQ~T<6Fh2$|uet&+YsS`D89V4yTwW+r%!|8hPp8sS#u6u77nq zcQF;php`-gD>pfTA{~Pdj$)9gt|TsnN~NTsTIT&(xE(~LUkZJ&w*Il)VEjLT_Tnu= zz+GMxZUv>K(29BV5zs-6PY6{Cs`%6$DL4)kYJA}fgTb;1&f zt^p^0j!UfM@e~67FJor?bGgZhH{gIBff_tUMGt(*XT4G$qfE42W`qrG@r6Phk++;JL&|Wh;;{nOnmB*veuS51owm?vQ_70 zgul&+8teyX7aA@$3mmQaphZ;}<4w!;K`pB1sS>%Z`4>Uf7Q>saofB^c6K&ok-pa{) z>y@#66UQmM>2Bt&hc{h2C*BMu7H`wZ?OSDP#()^no2Vl$RY+7V=4RtWxMr%IzcaU5Aa~X9p@j|ukm5M70e+}?ltVSJ_0&U z^I86ZBF(4#1N%T$TK_{mjxC0+@J*Fq{!Y9#%`71^<6WyP?byhqwGLPM8HqgYw|rSJtz z*}i~L!{4(M{;apdvfEC>XAVPzzsoYh-{wRc_I5o=y#MB~c?2hmz7+m}s*S!;o7u6C zDjV~K!pvH}BLU7L#xp3zm+2BxYpY}xdqdT&2q&c(1G$KYMOq5)!+2(!_>zq@ zeG#6_TDb#(O^aG_)FcTp}h+dHq{x&DxfxV4rR$CWv`9v%})A&THmPZ&d<-(_?tU7ezGrqcr%MyPG zk{qjx82EeyeEM^t$y4||4m?TUwBJpX6tPYmNE9MF?@pic??w*-aU5fScXvq0*=NFTEM5+b5?q6gOhe$*u>GPdji2Dfm9P^zli->c!Fvy+TBEC%X zDZ~{(Mp}#b1rmAYs)_m{a9Op6;gU{~HN4~Jsodnm_u;^{hU}7wp;y>!r+RD}8kq9U z*kW?ON!7E*dq%CU-bIwxpv5P%iq7y6jnLUK(D@S*orAP>+17#SSd=FBv{VcB`V^yP zKc65_%B)_R+18{N;4wmI(?IBVNrW<*y1>aLVR4zlFEgIoB|cB#GI%jCS|~TWy&G&j zV~Frb&h3iT&1FkNCk$;)7JVsvHO88r^4;%In_2id0)5tc$xymkt*?*y*wfLs7{uT% zC+@=5ZcSPmy1-{Mve--EpP8{|RgYSY{J5iJW~qg^{nC^;+>S;2vG=aAizoZiVedM! zfVc1lgOC&V;fTf{sVRp=IsuEx6rP+JyOlUJ*zemKCt#5e;i#_i1R1%9>ta~vZFhniBw`GLC&557Ep0M)j ziQ}|(R>{dyv&c>1J(;oRiH+KL&32*;9bY`lY>oY5fXfJ}Hw>iqNTfQnbV1X_&SEiz zFQsbF&>6L!$~FfU=hR2_vTH35TNr%Jz+l~p!ALs}dKwptxa1y`@tg)klU;)`UsKGi u1srZp1EZ-Eip-}bSzM;^qKs?h$0%GnzQmc;5yK&CWm-!o9v$osEdC!fAyxhW literal 0 HcmV?d00001 diff --git a/switchbutton.pri b/switchbutton.pri new file mode 100644 index 0000000..bc995c6 --- /dev/null +++ b/switchbutton.pri @@ -0,0 +1,9 @@ +INCLUDEPATH += $$PWD/ + +#SOURCES += \ +# $$PWD/SwitchButton.cpp + +HEADERS += \ + $$PWD/SwitchButton.h + +LIBS += -L. SwitchButton