在介绍一下QPropertyAnimation,QT里的一个动画类
button.show();
QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);
animation.setStartValue(QRect(0, 0, 0, 0));
animation.setEndValue(QRect(250, 250, 100, 30));
animation.start();
这段代码新建了一个QPropertyAnimation并绑定在button的“geomerty”属性上
并让button在10秒内从(0,0,0,0)的位置与尺寸变为(250,250,100,30)
属性简单的理解就是一个变量名,QPropertyAnimation的效果就是把绑定的变量从设定的初始值变为结束值
你也可以提供修改和读取变量的函数来自定义属性
在类定义时添加如下代码
Q_PROPERTY(int flag READ readFlag WRITE setFlag)
类内需要有这两个函数
void setFlag(int flag);
int readFlag();
pushbutton.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QPushButton>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QPainter>
class PushButton : public QPushButton
{
Q_OBJECT
Q_PROPERTY(int flag READ readFlag WRITE setFlag)
public:
PushButton(QWidget *parent = 0);
~PushButton();
void setPicture(QString file);
void setFramesNum(int num);
void setFlag(int flag);
int readFlag();
private:
QPixmap m_pixmap;
int m_flag;
int m_num;
QPropertyAnimation *runAni;
QPropertyAnimation *backAni;
protected:
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
void paintEvent(QPaintEvent *);
public slots:
void on_disconnect();
};
#endif // WIDGET_H
pushbutton.cpp
#include "pushbutton.h"
PushButton::PushButton(/*QString file,*/QWidget *parent)
: QPushButton(parent),m_flag(0),m_num(8)
{
runAni = new QPropertyAnimation(this,"flag");
runAni->setDuration(600);
runAni->setStartValue(0);
backAni = new QPropertyAnimation(this,"flag");
backAni->setDuration(600);
backAni->setEndValue(0);
}
PushButton::~PushButton()
{
}
void PushButton::setPicture(QString file)
{
m_pixmap.load(file);
setFixedSize(m_pixmap.width()/m_num,m_pixmap.height());
update();
}
void PushButton::setFramesNum(int num)
{
m_num = num;
setFixedSize(m_pixmap.width()/m_num,m_pixmap.height());
runAni->setEndValue(m_num-1);
backAni->setStartValue(m_num-1);
update();
}
void PushButton::setFlag(int flag)
{
m_flag = flag;
update();
}
int PushButton::readFlag()
{
return m_flag;
}
void PushButton::enterEvent(QEvent *)
{
runAni->start();
}
void PushButton::leaveEvent(QEvent *)
{
if(runAni->state() == QAbstractAnimation::Running)
{
connect(runAni,SIGNAL(finished()),backAni,SLOT(start()));
connect(backAni,SIGNAL(finished()),this,SLOT(on_disconnect()));
}
else
backAni->start();
}
void PushButton::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.drawPixmap(rect(),m_pixmap,QRect(m_pixmap.width()/m_num*m_flag,0,
m_pixmap.width()/m_num,m_pixmap.height()));
}
void PushButton::on_disconnect()
{
disconnect(runAni,SIGNAL(finished()),backAni,SLOT(start()));
disconnect(backAni,SIGNAL(finished()),this,SLOT(on_disconnect()));
}
mian.cpp
#include "pushbutton.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PushButton w;
w.setPicture("D:/QTobject/360demo/image/优化加速");//图片位置
w.setFramesNum(9);
w.show();
return a.exec();
}