Qt自定义控件-自定义SwitchButton

Qt自定义控件-自定义SwitchButton

概述

自定义SwitchButton,继承QWidget,然后重载paintEvent方法来绘制按键外观,其中动画效果通过定时器timer处理,可以自定义按键宽度、高度以及圆角,重载mousePressEvent方法实现点击功能;按键开关状态通过信号获取,实现方法多种多样,欢迎感兴趣的朋友探讨。
在这里插入图片描述

源码

#ifndef SWITCHBUTTON_H
#define SWITCHBUTTON_H

#include <QWidget>

class SwitchButton : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(bool buttonState READ buttonState WRITE setButtonState NOTIFY buttonStateChanged)
    Q_PROPERTY(int buttonWidth READ buttonWidth WRITE setButtonWidth)
    Q_PROPERTY(int buttonHeight READ buttonHeight WRITE setButtonHeight)
    Q_PROPERTY(int buttonRadius READ buttonRadius WRITE setButtonRadius)

public:
    explicit SwitchButton(QWidget *parent = nullptr,int buttonWidth = 100,int buttonHeight =50, int radius = 5);
    bool buttonState();
    void setButtonState(bool state);
    int buttonWidth();
    void setButtonWidth(int width);
    int buttonHeight();
    void setButtonHeight(int height);
    int buttonRadius();
    void setButtonRadius(int radius);



protected:
    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent *event) override;
private:
    int mButtonWidth;       //按键宽度
    int mButtonHeight;      //按键高度
    int mInnerBorder;       //按键内部边框大小
    int mButtonRadius;            //圆角
    bool mButtonState;      //按键状态
    int innerRectWidth;     //内部滑块宽度
    int innerRectHeight;    //内部滑块高度
    int sliderX;
    QTimer* timer;
    QColor buttonStateColor;    //按键状态颜色
    QString buttonstateStr;  //按键状态字
    int buttonTextX;  //按键状态字位置
    int buttonTextY;

    void switchOnOff();
public slots:
    void onTimeOut();
signals:
    void buttonStateChanged(bool ButtonState);

};

#endif // SWITCHBUTTON_H

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
源文件

#include "switchbutton.h"
#include <QPainter>
#include <QTimer>
#include <QMouseEvent>
SwitchButton::SwitchButton(QWidget *parent, int buttonWidth, int buttonHeight, int radius)
    : QWidget{parent},
      mButtonWidth(buttonWidth),
      mButtonHeight(buttonHeight),
      mButtonRadius(radius)
{
    //按键大小初始化
    mInnerBorder = 5;
    innerRectHeight = (mButtonHeight - 2*mInnerBorder);
    innerRectWidth = (mButtonWidth - 2*mInnerBorder)/2;
    sliderX = -innerRectWidth; //按键滑块的初始位置,位于按键左侧

    //按键状态初始化
    buttonstateStr = "开";
    buttonStateColor = QColor(200,200,200);
    mButtonState = false;

    QFontMetrics textSize = QWidget::fontMetrics();
    QRect textRect=textSize.tightBoundingRect(buttonstateStr);//得到字符串的rect
    buttonTextX = mButtonWidth/4 - textRect.width()/2;
    buttonTextY = textRect.height()/2;
    timer = new QTimer(this);
    timer->setInterval(2);
    connect(timer,SIGNAL(timeout()),this,SLOT(onTimeOut()));


}

bool SwitchButton::buttonState()
{
    return mButtonState;
}

void SwitchButton::setButtonState(bool state)
{
    mButtonState = state;
}

int SwitchButton::buttonWidth()
{
    return mButtonWidth;
}

void SwitchButton::setButtonWidth(int width)
{
    mButtonWidth = width;
    update();
}

int SwitchButton::buttonHeight()
{
    return mButtonHeight;
}

void SwitchButton::setButtonHeight(int height)
{
    mButtonHeight = height;
    update();
}

int SwitchButton::buttonRadius()
{
    return mButtonRadius;
}

void SwitchButton::setButtonRadius(int radius)
{
    mButtonRadius = radius;
    update();
}

void SwitchButton::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    //设置视口坐标和窗口坐标
    int width = this->rect().width();
    int height = this->rect().height();
    painter.setViewport(this->rect());
    painter.setWindow(-width/2,-height/2,width,height);
    painter.setPen(Qt::NoPen);

    painter.setRenderHints(QPainter::Antialiasing);
    painter.setBrush(buttonStateColor);
    painter.drawRoundedRect(-mButtonWidth/2,-mButtonHeight/2,mButtonWidth,mButtonHeight,mButtonRadius,mButtonRadius);

    //绘制滑块
    painter.setBrush(QColor("white"));
    painter.drawRoundedRect(sliderX,-innerRectHeight/2,innerRectWidth,innerRectHeight,mButtonRadius,mButtonRadius);

    //绘制开关状态文字
//    QFont font = this->font();
//    qDebug()<<"font.pixelSize = "<<font.pixelSize();
//    font.setPixelSize(10);
//    this->setFont(font);


//    QFontMetrics textSize = QWidget::fontMetrics();
//    QRect textRect=textSize.tightBoundingRect(buttonstateStr);//得到字符串的rect

//    QPen pen;
//    pen.setColor("red"); //划线颜色
//    painter.setPen(pen);
//    painter.drawText(buttonTextX,buttonTextY,buttonstateStr);
////    painter.drawRect(textRect);
}

void SwitchButton::mousePressEvent(QMouseEvent *event)
{
    switch (event->type()) {
    case QEvent::MouseButtonPress:
        switchOnOff();
        break;
    default:
        QWidget::mousePressEvent(event);
        break;
    }
}

void SwitchButton::switchOnOff()
{
    mButtonState = !mButtonState;
    buttonTextX = -buttonTextX;
    timer->start();
    if(mButtonState){
        buttonstateStr = "关";
        buttonStateColor = QColor("#11EE11");
        emit buttonStateChanged(mButtonState);
    }else{
        buttonstateStr = "开";
        buttonStateColor = QColor(200,200,200);
        emit buttonStateChanged(mButtonState);
    }

}

void SwitchButton::onTimeOut()
{
    static int i = 0;
    qDebug()<<"timeOut "<<i++;

    if(mButtonState){ //打开开关,滑块往右滑动
        sliderX +=1;
        if(sliderX >=0){
            timer->stop();
        }
    }else{          //关闭开关,滑块往左滑动
        sliderX -=1;
        if(sliderX <=-innerRectWidth){
            timer->stop();
        }
    }
    update();
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

后续功能将持续更新。。。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jkdon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值