1.自定义开关控件;
2.点击有动画效果;
3.在动画效果中,不再响应信号;
运行截图如下:
输出响应信号:
源码如下:
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";
}
}