• fly.h

     #ifndef FLY_H
    #define FLY_H
    #include <QObject>
    #include <QPainter>
    #include <QGraphicsScene>
    #include <QGraphicsView>
    #include <QGraphicsItem>
    #include <QPixmap>
    #include <math.h>
    #include <QTime>
    #include <QEvent> //图元对象
    class fly : public QObject,public QGraphicsItem
    {
    Q_OBJECT
    public:
    explicit fly(QObject *parent = nullptr); //区域
    QRectF boundingRect() const;
    //时间定时器
    void timerEvent(QTimerEvent *event);
    signals: public slots: protected:
    //绘制
    void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget); public:
    bool up;
    QPixmap pix_up;
    QPixmap pix_down; qreal angle; }; #endif // FLY_H
  • fly.cpp
     #include "fly.h"
    
     fly::fly(QObject *parent) : QObject(parent)
    {
    //载入
    up = true;
    pix_up.load("up.png");
    pix_down.load("down.png"); startTimer();
    } //图元的边界区域
    QRectF fly::boundingRect() const
    {
    qreal angletemp = ;
    return QRectF(-pix_up.width()/-angletemp,
    -pix_up.height()/-angletemp,
    pix_up.width()+angletemp*,
    pix_up.height()+angletemp*);
    } //定时器函数
    void fly::timerEvent(QTimerEvent *event)
    {
    //边界控制
    qreal edgex = scene()->sceneRect().right()+boundingRect().width()/;
    qreal edgetop=scene()->sceneRect().top()+boundingRect().height()/;
    qreal edgebottom = scene()->sceneRect().bottom()+boundingRect().height()/; 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()); #define PI 3.14
    angle += (qrand() % )/20.0;
    qreal dx = fabs(sin(angle*PI)*);
    qreal dy = (qrand()%)-10.0; //设置位置,转换坐标
    setPos(mapToParent(dx,dy));
    } void fly::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;
    }
    }
  • main.cpp
     #include "dialog.h"
    #include <QApplication>
    #include <QGraphicsScene>
    #include <QGraphicsView>
    #include "fly.h" int main(int argc, char *argv[])
    {
    QApplication a(argc, argv); //创建图像场景
    QGraphicsScene *scene = new QGraphicsScene;
    //设置区域
    scene->setSceneRect(-,-,,); fly *f = new fly;
    f->setPos(-,);
    scene->addItem(f); QGraphicsView *view = new QGraphicsView;
    view->setScene(scene);
    view->resize(,);
    view->show(); return a.exec();
    }

35.QT蝴蝶飞舞的更多相关文章

  1. Qt-MVC图形视图框架初识

    使用QPushButton.QLabel.QCheckBox等构成GUI的控件或自定义图形时,开发应用程序会变得很简单.但是如果想在GUI中使用数十个或者数百个图形对象,向用户完美展示控制场景,则会受 ...

  2. Linux - 变量

    printenv - print all or part of environment 显示所有变量:print 显示某个变量:print <variable name> 或者 echo ...

  3. Ubuntu终端命令行不显示颜色

    在网上找到的一个有效方案是在.bash_profile 中增加颜色定义 export LS_COLORS='di=01;35:ln=01;36:pi=40;33:so=01;35:do=01;35:b ...

  4. ubuntu 14.04 下找不到命令,路径出错

    在安装一些东西时,可能操作上不小心把路径覆盖或打错,造成一些基本命令如ls mkdir等无法使用,就会出现以下提示错误. 错误: 由于/usr/bin 不在PATH 环境变量中,故无法找到该命令 根本 ...

  5. crontab不能正确执行的问题

    近期在部署crontab任务的时候,总是遇到在shell中单独执行正常,但是放到crontab定时执行出错的问题.若出现这类场景,九成就是环境变量的问题. 因为我的定制任务,基本上都需要使用sqlpl ...

  6. python模块(os)

    os模块 os模块提供了许多与操作系统交互的接口 os.getcwd() -> str # 返回当前路径, 相当于pwd os.chdir("dirname") -> ...

  7. 查看linux系统常用的命令,Linux查看系统配置常用命令

    一.linux CPU大小  cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep &qu ...

  8. ansible官方文档翻译之变量

    Ansible变量 在使用ansible变量的时候,主要是因为各个系统的不同,从而需要使用不同的变量来进行设置,例如在设置一些配置文件的时候,有大部分内容是相同的,但是一部分内容是和主机的ip地址或者 ...

  9. 6款基于SVG的HTML5应用和动画

    1.HTML5 SVG 3D蝴蝶飞舞动画 逼真超酷 这次我们要分享的这款HTML5动画简直就是逆天,利用SVG制作的3D蝴蝶飞舞动画,蝴蝶飞舞动画非常逼真,蝴蝶飞舞的路线是利用SVG构造的.另外,动画 ...

随机推荐

  1. javascript 公历与农历相互转换工具类

    /** * 公历[1900-1-31,2100-12-31]时间区间内的公历.农历互转 * @charset UTF-8 * @Author Jea杨(JJonline@JJonline.Cn) * ...

  2. 前端-JQ思维导图

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记

  3. (转)19 个 JavaScript 有用的简写技术

    1.三元操作符 当想写if...else语句时,使用三元操作符来代替. const x = 20; let answer; if (x > 10) { answer = 'is greater' ...

  4. CaptCha的现状与未来

    2011年的老文.................转自于伯乐在线:http://blog.jobbole.com/4655/       有一个机会,朋友推荐一个创业的哥们给我认识,方向就是验证码识别 ...

  5. VS命令行的使用

    CD 命令是改变当前路径,但是它不会改变当前盘符,改变盘符要输入 [盘符]: 命令. 如下: Setting environment for using Microsoft Visual Studio ...

  6. Juery实现选项卡

    选项卡是一种很常用的组件.比如3个选项的选项卡,比较笨的一种办法是,把3个状态写成3个独立页面,互相链接.这样做的问题也显而易见,切换的时候url会变.如果是手机端网页,加载慢一点,给人的感觉是不断的 ...

  7. 一文带您了解5G的价值与应用

    一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...

  8. vue学习笔记——脚手架安装

    项目启动:npm run build 脚手架 vue cli vue cli --2 安装命令 #全局安装 npm install --global vue-cli #卸载vue-cli  npm u ...

  9. 前端html之------>Table实现表头固定

    文章来源于:https://www.cnblogs.com/dacuotecuo/p/3657779.html,请尊重原创,转载请注明出处. 说明:这里主要实现了表头的固定和上下滚动的滑动实现:时间的 ...

  10. centos7 选定默认启动内核,及删除无用内核

    #使用cat /boot/grub2/grub.cfg |grep menuentry 查看系统可用内核 [root@bigapp-slave27 ~]# cat /boot/grub2/grub.c ...