当前位置:   article > 正文

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

qpropertyanimation

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

直接上代码

所有文件:

mybtn.h

  1. #ifndef MYBTN_H
  2. #define MYBTN_H
  3. #include <QObject>
  4. #include <QWidget>
  5. #include<QPaintEvent>
  6. #include<QEvent>
  7. #include<QPushButton>
  8. #include<qpropertyanimation.h>
  9. #include<QDebug>
  10. class mainButton : public QPushButton//用于主的图片
  11. {
  12. Q_OBJECT
  13. public:
  14. mainButton(QString pixenter, QString pixleave, QWidget*parent);
  15. ~mainButton();
  16. protected:
  17. //鼠标进入事件
  18. void enterEvent(QEvent*);
  19. //鼠标离开事件
  20. void leaveEvent(QEvent*);
  21. //绘制动态图片
  22. void paintEvent(QPaintEvent*);
  23. //两个动画类:一个进入一个离开
  24. QPropertyAnimation*m_enteranimation;
  25. QPropertyAnimation*m_leaveanimation;
  26. //存储进入、离开事件需要绘画的图片
  27. QList<QPixmap> m_enterlist;
  28. QList<QPixmap> m_leavelist;
  29. //进入事件绘制的图片下标
  30. int m_enterIndex;
  31. //离开事件绘制的图片下标
  32. int m_leaveIndex;
  33. //标志位
  34. bool m_enter;
  35. bool m_leave;
  36. public slots:
  37. void entervaluechange(QVariant var){m_enterIndex=var.toInt();update();}
  38. void leavevaluechange(QVariant var){m_leaveIndex=var.toInt();update();}
  39. };
  40. #endif // MYBTN_H

mybtn.c

  1. #include "mybtn.h"
  2. #include<QPainter>
  3. #include<QDebug>
  4. #include<QLabel>
  5. #include<QHBoxLayout>
  6. #include<QFontMetrics>
  7. mainButton::mainButton(QString strpixenter,QString strpixleave,QWidget*parent):QPushButton(parent)
  8. {
  9. QPixmap pixenter(strpixenter);
  10. QPixmap pixleave(strpixleave);
  11. m_leave=false;
  12. m_enter=true;
  13. m_leaveIndex=0;
  14. m_enterIndex=0;
  15. for(int i=0;i<10;i++)//进入
  16. {
  17. m_enterlist<<pixenter.copy(i*(pixenter.width()/10),0,pixenter.width()/10,pixenter.height());
  18. }
  19. for(int j=0;j<8;j++)//离开
  20. {
  21. m_leavelist<<pixleave.copy(j*(pixleave.width()/8),0,pixleave.width()/8,pixleave.height());
  22. }
  23. //QPropertyAnimation的效果就是把绑定的变量从设定的初始值变为结束值
  24. m_enteranimation=new QPropertyAnimation(this,"");
  25. m_enteranimation->setStartValue(0);
  26. m_enteranimation->setEndValue(9);
  27. //动画的持续时间
  28. m_enteranimation->setDuration(600);
  29. connect(m_enteranimation,SIGNAL(valueChanged(QVariant)),this,SLOT(entervaluechange(QVariant)));
  30. m_leaveanimation=new QPropertyAnimation(this,"");
  31. m_leaveanimation->setStartValue(0);
  32. m_leaveanimation->setEndValue(7);
  33. m_leaveanimation->setDuration(600);
  34. connect(m_leaveanimation,SIGNAL(valueChanged(QVariant)),this,SLOT(leavevaluechange(QVariant)));
  35. }
  36. mainButton::~mainButton()
  37. {
  38. delete m_leaveanimation;
  39. delete m_enteranimation;
  40. }
  41. void mainButton::enterEvent(QEvent *)
  42. {
  43. m_enter=true;
  44. m_leave=false;
  45. m_enteranimation->start();
  46. }
  47. void mainButton::leaveEvent(QEvent *)
  48. {
  49. m_enter=false;
  50. m_leave=true;
  51. m_leaveanimation->start();
  52. }
  53. void mainButton::paintEvent(QPaintEvent *)
  54. {
  55. QPainter painter(this);
  56. if(m_enter)
  57. painter.drawPixmap(rect(),m_enterlist.at(m_enterIndex));
  58. if(m_leave)
  59. painter.drawPixmap(rect(),m_leavelist.at(m_leaveIndex));
  60. }

在mainwindow.c中调用:

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "mybtn.h"
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. mainButton* m_btn=new mainButton(":/clean_Hover.png",":/clean_Leave.png",this);
  10. m_btn->setGeometry(30,30,95,95);
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14. delete ui;
  15. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/282897
推荐阅读
  

闽ICP备14008679号