QT 定时器与动画实现
生活随笔
收集整理的這篇文章主要介紹了
QT 定时器与动画实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
Qt提供圖形視圖框架(Graphics View Framework)、動畫框架(The Animation Framework)和狀態機框架(The State Machine Framework)來實現更加高級的圖形和動畫應用。使用這些框架可以快速設計出動態GUI應用程序和各種動畫、游戲程序。
問題
怎樣運用定時器和圖形框架來做一個簡單的動畫呢?
探索
Qt 是基于C++的gui類庫的開發平臺工具,當然制作動畫和游戲是完全可以實現的。但對初學者來說掌握這些框架需要一定的學習周期。不過編程軟件的學習,本質上是一個不斷練習,實踐的過程。創意+編程=動畫或者游戲,應該是一件十分有趣的事情。
圖形視圖框架重在理解。場景,視圖,圖形項還有坐標體系和事件機制。只有搞清楚這些對象,才能運用自如。
下面來看下實現的過程。
主函數main()中通過創設場景,放置圖形項,然后通過視圖來顯示。
添加一個myItem類來實現圖形項。最重要的是添加定時器事件。
#include "myitem.h" #include<QPainter> #include<QTimerEvent>#include <QCursor> #include <QKeyEvent> #include <QGraphicsSceneHoverEvent> #include <QGraphicsSceneContextMenuEvent> #include <QMenu> #include<QtMath>#include<QDebug>MyItem::MyItem() {brushColor = Qt::red;//初始化定時器功能startTimer(1000);setFlag(QGraphicsItem::ItemIsFocusable);setFlag(QGraphicsItem::ItemIsMovable);setAcceptHoverEvents(true); }//重載boundingRect()函數來繪制矩形 QRectF MyItem::boundingRect() const {qreal adjust = 0.5;return QRectF(-10 - adjust, -10 - adjust,20 + adjust, 20 + adjust); }//重載paint()函數實現填充 void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) {if(hasFocus()) {painter->setPen(QPen(QColor(255,255,255,200)));} else {painter->setPen(QPen(QColor(100,100,100,100)));}painter->setBrush(brushColor);painter->drawRect(-10, -10, 20, 20); }// 鼠標按下事件處理函數,設置被點擊的圖形項獲得焦點,并改變光標外觀 void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {setFocus();setCursor(Qt::ClosedHandCursor); }// 鍵盤按下事件處理函數,判斷是否是向下方向鍵,如果是,則向下移動圖形項 void MyItem::keyPressEvent(QKeyEvent *event) {if(event->key() == Qt::Key_Down)moveBy(0, 10); }// 懸停事件處理函數,設置光標外觀和提示 void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {setCursor(Qt::OpenHandCursor);setToolTip("I am item"); }// 右鍵菜單事件處理函數,為圖形項添加一個右鍵菜單 void MyItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {QMenu menu;QAction *moveAction = menu.addAction("move back");QAction *selectedAction = menu.exec(event->screenPos());if(selectedAction == moveAction) {setPos(0, 0);} }void MyItem:: timerEvent(QTimerEvent *timeevent) {qDebug()<<"timer1";angle +=(qrand()%10)/20.0;qreal dx = sin(angle)*50.0 + (qrand()%10)*(qrand()%10)*10;qreal dy = cos(angle)*50.0 + (qrand()%10)*10;qDebug()<<"dx :"<<dx <<endl;setPos(dx,dy);} #ifndef MYITEM_H #define MYITEM_H#include <QGraphicsItem> #include <QObject>class MyItem : public QObject,public QGraphicsItem {Q_OBJECT public:MyItem();QRectF boundingRect() const;void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *QWidget);void setColor(const QColor &color) { brushColor = color; }protected:void keyPressEvent(QKeyEvent *event);void mousePressEvent(QGraphicsSceneMouseEvent *event);void hoverEnterEvent(QGraphicsSceneHoverEvent *event);void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);void timerEvent(QTimerEvent *timeevent);private:int id1;QColor brushColor;bool up;QPixmap pix_up;QPixmap pix_down;qreal angle;};#endif // MYITEM_Hok!效果馬上出來了。小方塊就會在圖中隨機運動了。就是這么簡單。
資源鏈接:
https://download.csdn.net/download/qq_21291397/12197372
總結
以上是生活随笔為你收集整理的QT 定时器与动画实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法解读--递归(二)
- 下一篇: QThreadPool Class的翻译