Qt 飞舞的蝴蝶

news/2024/11/30 2:48:08/

用Qt实现一群飞舞的蝴蝶,看起来还是蛮漂亮的,下面来给出代码吧,难度不大,也没有什么好分析的,就简单的写了点注释,在我的资源空间也上传了代码,需要的可以去下载。如果运行过程中有什么疑问的话可以留言于本人联系。

 

//***************mainwindow.h*******************//

#ifndef BUTTERFLY_H

#define BUTTERFLY_H
#include <QGraphicsItem>
#include <QObject>
class Butterfly : public QObject, public QGraphicsItem
{
    Q_OBJECT
public:
    Butterfly();
    void timerEvent(QTimerEvent *);//声明定时器的timerEvent()函数
    QRectF boundingRect() const;   //该函数必须实现
   
protected:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    //重画函数
    
private:
    bool up; //用于实现蝴蝶的飞舞画面
    QPixmap pix_up;  //蝴蝶图案一
    QPixmap pix_down; //蝴蝶
    qreal angle;
};
#endif 	// BUTTERFLY_H

//***************end end end end*******************//

//***************mainwindow.cpp*******************//

#include "butterfly.h"
#include <QtGui>
#include <math.h>
static const double PI = 3.14;
Butterfly::Butterfly()
{ 
    pix_up.load(":/images/butterfly1.png");   //图片的加载
    pix_down.load(":/images/butterfly2.png");
    up = true;
    startTimer(100);  //时间间隔100毫秒
    
}
QRectF
Butterfly::boundingRect() const   //加载蝴蝶项目的限定范围,以其自身的坐标系为基础设定的
{
    qreal adjust = 2;
    return QRectF(-pix_up.width()/2-adjust,-pix_up.height()/2-adjust,
    			pix_up.width()+adjust*2,pix_up.height()+2*adjust);
}
//一下函数实现蝴蝶的飞舞效果
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 *)
{
    // edge controll
    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;
    //flash = !flash;
    setPos(mapToParent(dx,dy));//映射到场景的坐标
    update();
}

//***************end end end end*******************//

//***************main.cpp*******************//

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "butterfly.h"
int main(int argc, char * argv[])
{
    QApplication app(argc,argv);
    QGraphicsScene *scene = new QGraphicsScene;
    scene->setSceneRect(QRectF(-400,-300,800,600));
    for(int i=0;i<100;i++){
    Butterfly *butterfly = new Butterfly;
    //为每一个飞舞的湖底产生一个随机位置
    butterfly->setPos((qrand()%int(scene->sceneRect().width()))-400,(qrand()%int(scene->sceneRect().height()))-300);
    scene->addItem(butterfly);
    }
    
    QGraphicsView *view = new QGraphicsView;
    view->setScene(scene);
    view->setMaximumSize(800,600);
    view->setMinimumSize(800,600);
    view->show();
    return app.exec();
}

//***************main.cpp*******************//

以上便是实现飞舞的蝴蝶群全部的实现代码了 欢迎共同学习交流所用


http://www.ppmy.cn/news/155534.html

相关文章

PaddleClas蝴蝶分类

任务描述 近年来&#xff0c;随着人工智能的发展&#xff0c;其在语音识别、自然语言处理、图像与视频分析等诸多领域取得了巨大成功。如何将人工智能技术应用到更广泛的领域成为了重要目标&#xff0c;本次竞赛将聚焦蝴蝶图片的细粒度图像分类&#xff0c;利用人工智能技术&a…

蝴蝶算法

Radix&#xff0d;r Cooley&#xff0d;Tukey算法 Cooley&#xff0d;Tukey算法区别于其他FFT算法的一个重要事实就是N的因子可以任意选取。这样也就可以使用N&#xff1d;rS的Radix&#xff0d;r算法了。最流行的算法都是以r&#xff1d;2或r&#xff1d;4为基的&#xff0c;最…

CF 868 div2 A—C

A 题就是一个预处理然后进行枚举 首先数据范围不是很大 然后我们依照题意看看如何构造出对应的要求&#xff0c;也就是说我们需要在不同的下标下使得 ai*aj1 那么只有1 1 或者-1 -1 那么这个不管是1 1 还是-1 -1 必然是对称的 那么要多少个1 可以组成对应要求 我们可以发现…

蝴蝶飞舞(butterfly)

蝴蝶 示例HTMLCSSJS 更多有趣示例 尽在 知屋安砖社区 示例 HTML .p-summaryh1 Butterflypa(href"https://ykob.github.io/sketch-threejs/sketch/butterfly.html", target"_blank")|this source.canvas(id"canvas-webgl", class"p-canvas…

Python蝴蝶曲线

题目要求 思路分析 a表示长度&#xff0c;t表示角度&#xff0c;因为题目给出的范围是0~24π&#xff0c;所以t从零开始取值到end(24π)结束&#xff0c;通过每一次的t得到x&#xff0c;y的值并绘制x&#xff0c;y&#xff0c;为了让线条更连贯&#xff0c;每次t增加0.1 代码…

快速傅里叶变换(FFT):蝶形算法(CT蝴蝶、GS蝴蝶)

参考文献&#xff1a; Cooley J W, Tukey J W. An algorithm for the machine calculation of complex Fourier series[J]. Mathematics of computation, 1965, 19(90): 297-301.Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Comput…

动态壁纸-蝴蝶

往背景图上贴小图 1.新建一个空的标准大小的图 bitmap Bitmap.createBitmap(480, 800, Config.ARGB_8888); 2.新建画布,将这个图作为参数传进来 Canvas c new Canvas(bitmap); 3.将小图画到这个画布上 c.drawBitmap(bm1, 97 , 0, null); 4.新建另一用于显示的画布 Can…

蝴蝶网络 Butterfly network

蝴蝶网络分支ntwk-butterfly git clone --branch ntwk-butterfly https://github.com/filecoin-project/lotus.git# cd lotus/ # git show commit 337c57093404431eb2d347f97f7d8f61993814cd (HEAD -> ntwk-butterfly, tag: ntwk-butterfly-7.10.0, origin/ntwk-butterfly)…