一、运行效果

二、具体代码

butterfly.h

#ifndef BUTTERFLY_H
#define BUTTERFLY_H#include <QObject>
#include <QPainter>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>class Butterfly : public QObject,public QGraphicsItem  //继承自QGraphicsIten,自定义图元
{Q_OBJECT
public:explicit Butterfly(QObject *parent = 0);void timerEvent(QTimerEvent *);  //定时器实现动画的原理是在定时器的timerEvent()中对QGraphicsItem进行重绘QRectF boundingRect() const;  //为图元限定区域范围,所有继承自QGraphicsItem的自定义图元都必须实现次函数protected:void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget);private:bool up;  //用于标志蝴蝶翅膀的位置(位于上或下)QPixmap pix_up;  //用于表示两幅蝴蝶的图片QPixmap pix_down;qreal angle;};#endif // BUTTERFLY_H

butterfly.cpp

#include "butterfly.h"
#include <math.h>const static double PI = 3.1416;Butterfly::Butterfly(QObject *parent) : QObject(parent)
{up = true;pix_up.load("up.png");pix_down.load("down.png");startTimer(100);  //启动定时器,并设置时间间隔为100毫秒
}QRectF Butterfly::boundingRect() const
{qreal adjust = 2;return QRect(-pix_up.width()/2 - adjust, -pix_up.height()/2 - adjust, pix_up.width() + adjust*2, pix_up.height() + adjust*2);
}void Butterfly::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{if(up){painter->drawPixmap(boundingRect().topLeft(),pix_up);up = !up;}else{painter->drawPixmap(boundingRect().topLeft(),pix_down);up = !up;}
}void Butterfly::timerEvent(QTimerEvent *)
{//限定蝴蝶飞舞的右边界qreal EdgeX = scene()->sceneRect().right() + boundingRect().width()/2;  //限定蝴蝶飞舞的上边界qreal EdgeTop = scene()->sceneRect().top() + boundingRect().height()/2;//限定蝴蝶飞舞的下边界qreal EdgeBottom = scene()->sceneRect().bottom() + boundingRect().height()/2;if(pos().x() >= EdgeX)  //若超过了右边界,则水平移回左边界setPos(scene()->sceneRect().left(),pos().y());if(pos().y() <= EdgeTop)  //若超过了上边界,则水平移回下边界setPos(pos().x(),scene()->sceneRect().bottom());if(pos().y() >= EdgeBottom)  //若超过了下边界,则水平移回上边界setPos(pos().x(),scene()->sceneRect().top());angle += (qrand()%10)/20.0;  qreal dx = fabs(sin(angle*PI)*10.0);qreal dy = (qrand()%20)-10.0;setPos(mapToParent(dx,dy));//dx,dy完成蝴蝶随机飞行的路径,且dx,dy是相对于蝴蝶的坐标系而言的,因此应使用mapToParent()函数映射为场景的坐标
}

main.cpp

#include <QApplication>
#include <QGraphicsScene>
#include "butterfly.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene *scene = new QGraphicsScene;scene->setSceneRect(QRectF(-200,-200,400,400));Butterfly *butterfly = new Butterfly;butterfly->setPos(-100,0);scene->addItem(butterfly);QGraphicsView *view = new QGraphicsView;view->setScene(scene);view->resize(400,400);view->show();return a.exec();
}

学习QT之图形视图实例#-飞舞的蝴蝶相关推荐

  1. Qt图形视图实例:飞舞的蝴蝶

    1.运行效果 2.具体代码 ​​butterfly.h​​ #ifndef BUTTERFLY_H #define BUTTERFLY_H#include <QObject> #inclu ...

  2. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...

  3. Qt图形视图框架图片图元QGraphicsPixmapItem

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...

  4. 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo

    1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...

  5. Qt修炼手册6_图形:图形视图框架

    1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...

  6. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  7. [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)

    [Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主  发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...

  8. qt 实现拖动矩形角度_Qt 绘图之图形视图框架

    恒歌科技 2019/11/29 在Qt中我们可以通过QWidget的派生类,重写paintEvent()函数,使用QPainter绘制我们想要的任何内容.这种方法对于从QWidget派生的窗口部件很理 ...

  9. Qt知识回顾(十)——图形视图、动画和状态机框架

      Qt提供了图形视图框架(Graphics View Framework).动画框架(The Animation Framework)和状态机框架(The State Machine Framewo ...

最新文章

  1. 只需一行代码,纯文本秒变Markdown
  2. matlab里面如何保留小数特定位数(转载)
  3. maven+springMVC+Eclipse建立工程框架
  4. c语言标准输入输出ppt,c语言输入输出语句PPT
  5. java 基础面试 英文_[Java面试] 面试java基础总结大全
  6. TCPDUMP/LIBPCAP 2-搭建环境
  7. js表单验证,给出友好的提示
  8. JDK源码学习笔记——Enum枚举使用及原理
  9. 对6月份的项目的总结
  10. drupal主题开发_Drupal开发人员,关于如何使您的网站更易于访问
  11. Good Bye 2017
  12. 蓝桥杯 ALGO-60 算法训练 矩阵乘方
  13. 【医疗影像处理】使用GMM分割3D T1得到wm/gm/csf/background
  14. *第八周*数据结构实践项目二【建设链串算法库】
  15. Java文件的写入与读出
  16. tableau学生版注册流程
  17. 【重要通知】关于免费升级至神策分析 2.3 版本的说明
  18. SqList *L 和 SqList * L的一些理解以及多重指针的简单应用
  19. 【改进灰狼优化算法】贪婪的非分层灰狼优化算法(Matlab代码实现)
  20. C语言输入Aa1Bb2Cc3,C语言shuzu_test.doc

热门文章

  1. Linux 发展历程
  2. adnroid 系统OTA升级
  3. 解决:Word中无法使用“粘贴”快捷键
  4. 「塔望咨询」×「皇品食品」2022上半年营销集锦
  5. Windows和Linux下排查C++软件异常的常用调试器与内存检测工具详细介绍
  6. 过敏体质是一种什么样的体验
  7. 过敏性鼻炎、感冒、哮喘
  8. win7更改文件夹背景图片和文件夹背景色
  9. 宽依赖和窄依赖_Spark --【宽依赖和窄依赖】
  10. 经济危机与金融危机的学术解释与通俗到庸俗的解释,包你明白