学习QT之图形视图实例#-飞舞的蝴蝶
一、运行效果
二、具体代码
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之图形视图实例#-飞舞的蝴蝶相关推荐
- Qt图形视图实例:飞舞的蝴蝶
1.运行效果 2.具体代码 butterfly.h #ifndef BUTTERFLY_H #define BUTTERFLY_H#include <QObject> #inclu ...
- Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...
- Qt图形视图框架图片图元QGraphicsPixmapItem
文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...
- 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo
1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...
- Qt修炼手册6_图形:图形视图框架
1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...
- Qt图形视图框架详解-安晓辉-专题视频课程
Qt图形视图框架详解-12227人已学习 课程介绍 介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...
- [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)
[Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主 发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社 ...
- qt 实现拖动矩形角度_Qt 绘图之图形视图框架
恒歌科技 2019/11/29 在Qt中我们可以通过QWidget的派生类,重写paintEvent()函数,使用QPainter绘制我们想要的任何内容.这种方法对于从QWidget派生的窗口部件很理 ...
- Qt知识回顾(十)——图形视图、动画和状态机框架
Qt提供了图形视图框架(Graphics View Framework).动画框架(The Animation Framework)和状态机框架(The State Machine Framewo ...
最新文章
- 只需一行代码,纯文本秒变Markdown
- matlab里面如何保留小数特定位数(转载)
- maven+springMVC+Eclipse建立工程框架
- c语言标准输入输出ppt,c语言输入输出语句PPT
- java 基础面试 英文_[Java面试] 面试java基础总结大全
- TCPDUMP/LIBPCAP 2-搭建环境
- js表单验证,给出友好的提示
- JDK源码学习笔记——Enum枚举使用及原理
- 对6月份的项目的总结
- drupal主题开发_Drupal开发人员,关于如何使您的网站更易于访问
- Good Bye 2017
- 蓝桥杯 ALGO-60 算法训练 矩阵乘方
- 【医疗影像处理】使用GMM分割3D T1得到wm/gm/csf/background
- *第八周*数据结构实践项目二【建设链串算法库】
- Java文件的写入与读出
- tableau学生版注册流程
- 【重要通知】关于免费升级至神策分析 2.3 版本的说明
- SqList *L 和 SqList * L的一些理解以及多重指针的简单应用
- 【改进灰狼优化算法】贪婪的非分层灰狼优化算法(Matlab代码实现)
- C语言输入Aa1Bb2Cc3,C语言shuzu_test.doc