qt的动画按钮---QPropertyAnimation的使用(悬浮时的动态效果)

话不多说:解释都在代码里

直接上代码

所有文件:

qt的动画按钮---QPropertyAnimation的使用(悬浮时的动态效果)_第1张图片

mybtn.h

#ifndef MYBTN_H
#define MYBTN_H

#include 
#include 
#include
#include
#include
#include
#include
class mainButton : public QPushButton//用于主的图片
{
    Q_OBJECT
public:
    mainButton(QString pixenter, QString pixleave, QWidget*parent);
    ~mainButton();
protected:
    //鼠标进入事件
    void enterEvent(QEvent*);
    //鼠标离开事件
    void leaveEvent(QEvent*);
    //绘制动态图片
    void paintEvent(QPaintEvent*);
    //两个动画类:一个进入一个离开
    QPropertyAnimation*m_enteranimation;
    QPropertyAnimation*m_leaveanimation;
    //存储进入、离开事件需要绘画的图片
    QList m_enterlist;
    QList m_leavelist;
    //进入事件绘制的图片下标
    int m_enterIndex;
    //离开事件绘制的图片下标
    int m_leaveIndex;
    //标志位
    bool m_enter;
    bool m_leave;
public slots:
    void entervaluechange(QVariant var){m_enterIndex=var.toInt();update();}
    void leavevaluechange(QVariant var){m_leaveIndex=var.toInt();update();}
};

#endif // MYBTN_H

mybtn.c

#include "mybtn.h"
#include
#include
#include
#include
#include
mainButton::mainButton(QString strpixenter,QString strpixleave,QWidget*parent):QPushButton(parent)
{
    QPixmap pixenter(strpixenter);
    QPixmap pixleave(strpixleave);

    m_leave=false;
    m_enter=true;
    m_leaveIndex=0;
    m_enterIndex=0;
    for(int i=0;i<10;i++)//进入
    {
        m_enterlist<setStartValue(0);
    m_enteranimation->setEndValue(9);
    //动画的持续时间
    m_enteranimation->setDuration(600);
    connect(m_enteranimation,SIGNAL(valueChanged(QVariant)),this,SLOT(entervaluechange(QVariant)));

    m_leaveanimation=new QPropertyAnimation(this,"");
    m_leaveanimation->setStartValue(0);
    m_leaveanimation->setEndValue(7);
    m_leaveanimation->setDuration(600);
    connect(m_leaveanimation,SIGNAL(valueChanged(QVariant)),this,SLOT(leavevaluechange(QVariant)));
}
mainButton::~mainButton()
{
    delete m_leaveanimation;
    delete m_enteranimation;
}
void mainButton::enterEvent(QEvent *)
{
    m_enter=true;
    m_leave=false;
    m_enteranimation->start();
}
void mainButton::leaveEvent(QEvent *)
{
    m_enter=false;
    m_leave=true;
    m_leaveanimation->start();
}
void mainButton::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    if(m_enter)
    painter.drawPixmap(rect(),m_enterlist.at(m_enterIndex));
    if(m_leave)
    painter.drawPixmap(rect(),m_leavelist.at(m_leaveIndex));
}

在mainwindow.c中调用:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mybtn.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mainButton* m_btn=new mainButton(":/clean_Hover.png",":/clean_Leave.png",this);
    m_btn->setGeometry(30,30,95,95);
}

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

然后运行你就可以看到当你悬浮进入的动态效果了,效果就是这两张图的轮流显示

有需要的可以下载:https://download.csdn.net/download/qq_41399894/11255959

你可能感兴趣的:(Qt)