1.自定义开关控件;

2.点击有动画效果;

3.在动画效果中,不再响应信号;

运行截图如下:

Qt工作笔记-自定义开关控件

输出响应信号:

Qt工作笔记-自定义开关控件

源码如下:

myonoff.h

#ifndef MYONOFF_H
#define MYONOFF_H

#include <QLabel>

QT_BEGIN_NAMESPACE
class QPropertyAnimation;
QT_END_NAMESPACE

class MyOnOff : public QLabel
{
    Q_OBJECT
    Q_PROPERTY(int onoffStatus READ onoffStatus WRITE setOnoffStatus NOTIFY onoffStatusChanged)

public:
    enum status{ON,OFF};
    MyOnOff(QWidget *parent = 0);

    int onoffStatus()const;
    void setOnoffStatus(const int status);

signals:
    void onoffStatusChanged(int status);

protected:
    void paintEvent(QPaintEvent *event)Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QMouseEvent *event)Q_DECL_OVERRIDE;

    void controlWidgetChanged();

private:
    int m_onoffStatus;
    bool m_animationIsRun;
    QPropertyAnimation *m_propertyAnimation;
};

#endif // MYONOFF_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void onOffStatus(int status);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

myonoff.cpp

#include "myonoff.h"
#include <QPropertyAnimation>
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#include <QTimer>
#include <QEventLoop>

MyOnOff::MyOnOff(QWidget *parent)
    : QLabel(parent)
    , m_onoffStatus(ON)
    , m_animationIsRun(false)
{
    m_propertyAnimation=new QPropertyAnimation(this,"minimumSize");
}

int MyOnOff::onoffStatus() const
{
    return m_onoffStatus;
}

void MyOnOff::setOnoffStatus(const int status)
{
    m_onoffStatus=status;
    emit onoffStatusChanged(m_onoffStatus);
}

void MyOnOff::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.save();
    if(m_onoffStatus){
        painter.drawPixmap(0,0,QPixmap(":/img/off.png").scaled(minimumSize()));
    }
    else{
        painter.drawPixmap(0,0,QPixmap(":/img/on.png").scaled(minimumSize()));
    }
    painter.restore();
}

void MyOnOff::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton&&!m_animationIsRun){

        m_animationIsRun=true;
        bool onoffStatus=m_onoffStatus;
        setOnoffStatus(!onoffStatus);
        update();

        //Began to change
        controlWidgetChanged();
        m_animationIsRun=false;

    }
    event->accept();
}

void MyOnOff::controlWidgetChanged()
{
    m_propertyAnimation->setDuration(500);
    m_propertyAnimation->setStartValue(QSize(64,64));
    m_propertyAnimation->setEndValue(QSize(74,74));
    m_propertyAnimation->start();

    QEventLoop loop;
    QTimer::singleShot(1*600,&loop,&QEventLoop::quit);
    loop.exec();

    m_propertyAnimation->setDuration(500);
    m_propertyAnimation->setStartValue(QSize(74,74));
    m_propertyAnimation->setEndValue(QSize(64,64));
    m_propertyAnimation->start();

    QTimer::singleShot(1*500,&loop,&QEventLoop::quit);
    loop.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "myonoff.h"

#include <QDebug>

#ifndef OFF
#define OFF 1
#define ON 0
#endif

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->label,static_cast<void(MyOnOff::*)(int)>(&MyOnOff::onoffStatusChanged)
            ,this,&Widget::onOffStatus);
    setWindowTitle("CSDN IT1995");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onOffStatus(int status)
{
    if(status==OFF){
        qDebug()<<"The switch is off";
    }
    else{
        qDebug()<<"The switch is on";
    }
}

 

相关文章:

  • 2021-11-19
  • 2022-12-23
  • 2021-08-22
  • 2021-12-19
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-18
  • 2021-11-05
  • 2021-04-01
  • 2022-12-23
  • 2022-12-23
  • 2021-04-26
相关资源
相似解决方案