由于项目需求,需要把一张图片做圆周运动,用到了属性动画,坐标计算等。

在编写代码的过程中,由于太长时间没用sin,cos函数忘了是用弧度为单位,汗呀

下面把代码贴出来

  1. /*
  2. * 圆周运动动画
  3. * */
  4. #ifndef CircleAnimationWidget_H
  5. #define CircleAnimationWidget_H
  6. #include <QWidget>
  7. #define PI  3.1415
  8. class QPropertyAnimation;
  9. class CircleAnimationWidget : public QWidget
  10. {
  11. Q_OBJECT
  12. //注册属性,用于动画
  13. Q_PROPERTY(qreal percent READ percent WRITE setPercent)
  14. public:
  15. explicit CircleAnimationWidget(QWidget *parent = 0);
  16. explicit CircleAnimationWidget(const QString &icon, \
  17. const qreal &radius, QWidget *parent = 0);
  18. void setCircleInfo(const QString &icon, const qreal &radius);
  19. void startAnimation();
  20. void stopAnimation();
  21. void setPercent(const qreal &per);
  22. const qreal &percent()
  23. {
  24. return m_percent;
  25. }
  26. protected:
  27. void paintEvent(QPaintEvent *);
  28. private slots:
  29. //更新坐标值
  30. void updatePos();
  31. private:
  32. //计算坐标值
  33. QPoint mathPoint();
  34. QPoint mathPoint(const QPoint ¢erPos, const qreal &percent, const qreal &radius);
  35. void initAnimation();
  36. private:
  37. qreal m_percent;//百分比
  38. qreal m_radius;//半径
  39. QPoint m_centerPos;//圆点坐标
  40. QPropertyAnimation *m_percentAnimation;
  41. QPixmap m_pix;
  42. QPoint m_point;//图片坐标
  43. QPoint m_originPoint;//图片原始坐标
  44. };
  45. #endif // CircleAnimationWidget_H
    1. #include "circleanimationwidget.h"
    2. #include <QPainter>
    3. #include <QPropertyAnimation>
    4. #include <qmath.h>
    5. CircleAnimationWidget::CircleAnimationWidget(QWidget *parent) :
    6. QWidget(parent)
    7. {
    8. this->setAttribute(Qt::WA_TranslucentBackground);
    9. }
    10. CircleAnimationWidget::CircleAnimationWidget(const QString &icon,\
    11. const qreal &radius, QWidget *parent) : QWidget(parent)
    12. {
    13. this->setAttribute(Qt::WA_TranslucentBackground);
    14. this->setCircleInfo(icon, radius);
    15. }
    16. void CircleAnimationWidget::initAnimation()
    17. {
    18. m_percentAnimation = new QPropertyAnimation(this, "percent");
    19. m_percentAnimation->setDuration(2000);
    20. m_percentAnimation->setStartValue(0.0);
    21. m_percentAnimation->setEndValue(1.0);
    22. m_percentAnimation->setLoopCount(-1); //无限循环,只有调用stop才会停止
    23. }
    24. void CircleAnimationWidget::startAnimation()
    25. {
    26. m_percentAnimation->start();
    27. }
    28. void CircleAnimationWidget::stopAnimation()
    29. {
    30. m_percentAnimation->stop();
    31. m_point = m_originPoint;
    32. m_percent = 0;
    33. update();
    34. }
    35. void CircleAnimationWidget::setCircleInfo(const QString &icon, const qreal &radius)
    36. {
    37. m_pix.load(icon);
    38. m_percent = 0;
    39. m_radius = radius;
    40. int pixW = m_pix.width();
    41. int pixH = m_pix.height();
    42. m_centerPos.setX(radius);
    43. m_centerPos.setY(radius);
    44. m_originPoint.setX(radius*2);
    45. m_originPoint.setY(radius);
    46. m_point = m_originPoint;
    47. this->setFixedSize(pixW + radius*2, pixH + radius*2);
    48. this->initAnimation();
    49. }
    50. void CircleAnimationWidget::setPercent(const qreal &per)
    51. {
    52. m_percent = per;
    53. updatePos();
    54. }
    55. void CircleAnimationWidget::updatePos()
    56. {
    57. m_point = mathPoint();
    58. update();
    59. }
    60. QPoint CircleAnimationWidget::mathPoint()
    61. {
    62. return this->mathPoint(m_centerPos, m_percent, m_radius);
    63. }
    64. QPoint CircleAnimationWidget::mathPoint(const QPoint ¢erPos, const qreal &percent, const qreal &radius)
    65. {
    66. qreal dx = radius * qCos(percent * ( 2 * PI)) + centerPos.x();//计算x坐标
    67. qreal dy = radius * qSin(percent * ( 2 * PI)) + centerPos.y(); // 计算y坐标
    68. return QPoint(dx, dy);
    69. }
    70. void CircleAnimationWidget::paintEvent(QPaintEvent *)
    71. {
    72. QPainter painter(this);
    73. painter.drawPixmap(m_point, m_pix);
    74. }

http://blog.csdn.net/zhjun5337/article/details/40789979

http://www.qtcn.org/bbs/read-htm-tid-57817-page-1.html

Qt自定义圆周动画(360 10.0 的模仿作者写的)的更多相关文章

  1. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  2. kafka_2.11-0.10.0.1生产者producer的Java实现

    转载自:http://blog.csdn.net/qq_26479655/article/details/52555283 首先导入包 将kafka目录下的libs中的jar包导入 用maven建立 ...

  3. iOS 10.0 更新点(开发者视角)

    html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padding: 0 ...

  4. ViewPager无限轮播与自定义切换动画

    一直在寻求一个能用得长久的ViewPager,寻寻觅觅终于发现,ViewPager有这一个就够了. 注:并非完全原创 先看一下效果: 淡入淡出: 旋转: 无限轮播的ViewPager 主要设计思路(以 ...

  5. 还在期待安卓9.0吗?Android 10.0要来了

    目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 Android 9.0 系统(修改UI界面也算是二次开发,嗯) ...

  6. Qt 创建按钮动画

    1 封装自定义按钮 myPushBttton 2 构造函数 (默认图片,按下后显示图片) 3 测试开始按钮 4 开始制作特效 5 zoom1 向下弹跳 6 zoom2 向上弹跳 代码如下 main.h ...

  7. 自定义带动画的Toast

    一.style样式: 1.  // 移动和透明渐变结合的动画 <style name="anim_view">        <item name="@ ...

  8. Android 自定义波浪动画 --"让进度浪起来~"

    原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...

  9. Kafka-0.10.0.0入门

    搭建环境略(伪集群即可以),但要注意Kafka的配置必须配置的,少配了也一样可以用,但是只能单机使用,外部机器无法连接,网上也有说. host.name=192.168.1.30 advertised ...

随机推荐

  1. SeekBar.OnSeekBarChangeListener解析

    public static interface SeekBar.OnSeekBarChangeListener android.widget.SeekBar.OnSeekBarChangeListen ...

  2. logstash 利用drop 丢弃过滤日志

    input { stdin { } } filter { grok { match => ["message","\s*%{TIMESTAMP_ISO8601}\s ...

  3. 数据库范式(1NF 2NF 3NF BCNF)详解

    数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不仅给 ...

  4. bzoj1148

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1148 很常见的排序贪心题...... 假设我们得到了一个最优序列,记s[n]=w[1]+w[2 ...

  5. java进阶计划

    鉴于自己在java 的学习过程中,像是无头苍蝇一样,东扎一把,西戳一下,没有一个明确的方向,也没有一个比较明确的方面,所以有了这个大致的计划. 计划的目标: 1. java本身的目标 对线程(thre ...

  6. 新闻:型牌男装:网上订服装,如何将返修率降到5个点以下 | IT桔子

    新闻:型牌男装:网上订服装,如何将返修率降到5个点以下 | IT桔子 型牌男装:网上订服装,如何将返修率降到5个点以下

  7. XSS初体验

    主要内容 什么是XSS? XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS?   什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自 ...

  8. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...

  9. Oracle—RMAN备份(三)

    一.增量备份的相关概念 1. 在前面说明了RMAN的完整备份,完整备份是备份所用使用过的块,不备份没有使用的过的块:增量备份只备份自上次备份以来更改过的块. 2.即使RMAN的默认操作是在增量备份时扫 ...

  10. Class的生命周期

    之前的<JVM类载入机制-ClassLoader>和<初探JVM-ClassLoader源代码>,仅仅是讨论了Class的载入部分,如今来纵观一下整个Class的生命周期. C ...