滑动按钮

直接贴图

 

 _______________________________________________________________________________________

代码画的动态

switchcontrol.h
#ifndef SWITCHCONTROL_H
#define SWITCHCONTROL_H

#include <QWidget>
#include <QTimer>

class SwitchControl : public QWidget
{
    Q_OBJECT

public:
    explicit SwitchControl(QWidget *parent = 0);

    //返回开关状态-打开:true 关闭:false
    bool isToggled() const;

    //设置开关状态
    void setToggled(bool checked=false);

    //设置背景颜色
    void setBackgroundColor(QColor color);

    //设置选中颜色
    void setCheckedColor(QColor color);

    //设置不可用颜色
    void setDisabledColor(QColor color);

protected:
    //绘制开关
    void paintEvent(QPaintEvent *event) ;

    //鼠标按下事件
    void mousePressEvent(QMouseEvent *event) ;

    //鼠标释放事件-切换开关状态、发射toggled()信号
    void mouseReleaseEvent(QMouseEvent *event) ;

    //大小改变事件
    void resizeEvent(QResizeEvent *event) ;

    //缺省大小
    QSize sizeHint() const ;
    QSize minimumSizeHint() const ;

signals:
    //状态改变时,发射信号
    void toggled(bool checked);

private slots:
    //状态切换时,用于产生滑动效果
    void onTimeout();

private:
    bool m_bChecked;            //是否选中
    QColor m_background;        //背景颜色
    QColor m_background_off;    //背景颜色

    QColor m_checkedColor;      //选中颜色
    QColor m_disabledColor;     //不可用颜色
    QColor m_thumbColor;        //关闭状态

    qreal m_radius;             //圆角
    qreal m_nX;                 //x点坐标
    qreal m_nY;                 //y点坐标
    qint16 m_nHeight;           //高度
    qint16 m_nMargin;           //外边距
    QTimer m_timer;             //定时器
};

#endif // SWITCHCONTROL
switchcontrol.cpp

 

#include "switchcontrol.h"

#include <switchcontrol.h>
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
SwitchControl::SwitchControl(QWidget *parent)
    :QWidget(parent),
      m_nHeight(38),
      m_bChecked(),
      m_radius(19.0),
      m_nMargin(4),
      m_checkedColor(QColor(255,255,255)), //打开时button 22,68,128   白
      m_thumbColor(QColor(255,255,255)),  //关闭时button 102,102,102  白
      m_disabledColor(QColor(242,242,242)),
      m_background(QColor("#4553C7")),    //打开时background 242,242,242 蓝
      m_background_off(QColor(218,218,213)) //关闭时background 242,242,242  灰
{
    //鼠标滑过光标形状-手型
    setCursor(Qt::PointingHandCursor);

    //连接信号槽
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
}

void SwitchControl::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setPen(Qt::NoPen);
    painter.setRenderHint(QPainter::Antialiasing);

    QPainterPath path;
    QColor background;
    QColor thumbColor;
    qreal dOpacity;
    if(isEnabled()){    //可用状态
        if(m_bChecked){    //打开状态
            background = m_background;
            thumbColor = m_checkedColor;
            dOpacity = 1;
        }else{      //关闭状态
           // background = m_background;
            background = m_background_off;
            thumbColor = m_thumbColor;
            dOpacity = 0.800;
        }
    }else{  //不可用状态
        // background = m_background;
        background = m_background_off;
        dOpacity = 0.260;
        thumbColor = m_disabledColor;
    }
    //绘制大椭圆
    painter.setBrush(background);
    painter.setOpacity(dOpacity);
    path.addRoundedRect(QRectF(m_nMargin, m_nMargin, width() - 2 * m_nMargin, height() - 2 * m_nMargin), m_radius, m_radius);
    painter.drawPath(path.simplified());

    //绘制小椭圆
    painter.setBrush(thumbColor);
    painter.setOpacity(1.0);
    painter.drawEllipse(QRectF(m_nX - (m_nHeight / 5), m_nY - (m_nHeight / 3.3), height() / 1.5, height() / 1.5));
}

//鼠标按下事件
void SwitchControl::mousePressEvent(QMouseEvent *event)
{
    if(isEnabled()){
        if(event -> buttons() & Qt::LeftButton){
            event -> accept();
        }else{
            event -> ignore();
        }
    }
}

//鼠标释放事件-切换开关状态、发射toggled()信号
void SwitchControl::mouseReleaseEvent(QMouseEvent *event)
{
    if(isEnabled()){
        if((event->type() == QMouseEvent::MouseButtonRelease) && (event->button() == Qt::LeftButton)){
            event->accept();
            m_bChecked = !m_bChecked;
            emit toggled(m_bChecked);
            m_timer.start(10);
        }else{
            event->ignore();
        }
    }
}

//大小改变事件
void SwitchControl::resizeEvent(QResizeEvent *event)
{
    m_nX = m_nHeight / 2;
    m_nY = m_nHeight / 2;
    QWidget::resizeEvent(event);
}

//默认大小
QSize SwitchControl::sizeHint() const
{
    return minimumSizeHint();
}

//最小大小
QSize SwitchControl::minimumSizeHint() const
{
    return QSize(2 * (m_nHeight + m_nMargin),m_nHeight + 2 * m_nMargin);
}

//切换状态-滑动
void SwitchControl::onTimeout()
{
    if(m_bChecked){
        m_nX += 1;
        if(m_nX >= width() - m_nHeight)
            m_timer.stop();
    }else{
        m_nX -= 1;
        if(m_nX <= m_nHeight / 2)
            m_timer.stop();
    }
    update();
}

//返回开关状态-打开:true 关闭:false
bool SwitchControl::isToggled() const
{
    return m_bChecked;
}

//设置开关状态
void SwitchControl::setToggled(bool checked)
{
    m_bChecked = checked;
    m_timer.start(10);
}

//设置背景颜色
void SwitchControl::setBackgroundColor(QColor color)
{
    m_background = color;
}

//设置选中颜色
void SwitchControl::setCheckedColor(QColor color)
{
    m_checkedColor = color;
}

//设置不可用颜色
void SwitchControl::setDisabledColor(QColor color)
{
    m_disabledColor = color;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值