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

在编写代码的过程中,由于太长时间没用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. 数据库 SQL语句优化

    温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图 ...

  2. StoryBoard 加入一个自定义View

    1. 建一个 UIView的子类(MyView.h/MyView.m) 2. 建一个 View类型的XIB 3. 把xib的file‘s owner设为MyView 4. 在.h文件里加上 @prop ...

  3. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  4. .NET--接口设计

    我们学习.net视频的时候,老师讲的是"介面设计",有意思的是,这里的介面不是我们想象中的界面的意思,而是接口的意思. 由于视频是Micorsoft公司做的,所以整个视频看下来.仅 ...

  5. C++中的对象数组

    类是对象的抽象,我们可以使用一个类来定义很多的对象,然后每个对象都有自己的属性. 当我们使用类来定义很多相同结构的对象的时候,我们可以采取对象数组的方法. 例如,一个班有50个学生,我们定义了一个学生 ...

  6. LRU Cache的简单c++实现

    什么是 LRU LRU Cache是一个Cache的置换算法,含义是“最近最少使用”,把满足“最近最少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是最近刚刚访问的,因为这样的数据 ...

  7. Kerberos-KDC

    Kerberos提供一种较好的解决方案,它是由MIT发明的,Kerberos建立了一个安全的.可信任的密钥分发中心(KDC, Key Distribution Center).Kerberos是一种认 ...

  8. jquery商城类封装插件

    自从解决了定时器的问题后,什么都好弄了 这是仿苏宁商城banner的,当然我没弄得那么好啦,但是我想就是那个缩略图,我没弄好吧,方法我猜想是通过把所有li都放进数组,然后通过遍历,就可以做出相应的效果 ...

  9. 安装软件配置VC++环境时常出现的问题--Error 1935.安装程序集

    装很多软件是都要配置VC++环境的,但由于系统注册表限制,很多时候软件安装过程中会报如下错误 安装 vc++2005 运行库 Error 1935.安装程序集 Microsoft.vc80.atl,t ...

  10. C#不用COM组件导出数据到Excel中

    <?xml version='1.0'?><?mso-application progid='Excel.Sheet'?><Workbook xmlns='urn:sch ...