Qt5開發及實例學習之飛舞的蝴蝶

一、新建Qt GUI應用,基類QMainWindows,取消建立界面code

二、項目名稱上選擇「添加新文件」--->"C++類"-->基類「QObject」,類名"Butterfly"blog

三、butterfly.h圖片

#ifndef BUTTERFLY_H
#define BUTTERFLY_H

#include <QObject>
#include <QGraphicsItem>
#include <QPainter>
#include <QGraphicsScene>
#include <QGraphicsView>

class Butterfly : public QObject,public QGraphicsItem
{
    Q_OBJECT
public:
    explicit Butterfly(QObject *parent = nullptr);
    void timerEvent(QTimerEvent *);
    QRectF boundingRect() const;

signals:

public slots:

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.cppci

#include "butterfly.h"
#include <math.h>

const static double PI=3.1416;

Butterfly::Butterfly(QObject *parent) :
    QObject(parent)
{
    up = true;
    pix_up.load("F:\\MyCode\\Butterfly\\up.png");
    pix_down.load("F:\\MyCode\\Butterfly\\down.png");

    startTimer(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()+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));
}

main.cppget

#include "mainwindow.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsItem>
#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;

    scene->addItem(butterfly);

    QGraphicsView *view = new QGraphicsView(scene);
    view->resize(400, 400);
    view->show();

    return a.exec();
}

四、分析:從新實現bounding&painter,在timerEvent中設置邊界it

相關文章
相關標籤/搜索