一、新建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