日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT 定时器与动画实现

發布時間:2025/3/15 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT 定时器与动画实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言
Qt提供圖形視圖框架(Graphics View Framework)、動畫框架(The Animation Framework)和狀態機框架(The State Machine Framework)來實現更加高級的圖形和動畫應用。使用這些框架可以快速設計出動態GUI應用程序和各種動畫、游戲程序。

問題

怎樣運用定時器和圖形框架來做一個簡單的動畫呢?

探索
Qt 是基于C++的gui類庫的開發平臺工具,當然制作動畫和游戲是完全可以實現的。但對初學者來說掌握這些框架需要一定的學習周期。不過編程軟件的學習,本質上是一個不斷練習,實踐的過程。創意+編程=動畫或者游戲,應該是一件十分有趣的事情。

圖形視圖框架重在理解。場景,視圖,圖形項還有坐標體系和事件機制。只有搞清楚這些對象,才能運用自如。

下面來看下實現的過程。
主函數main()中通過創設場景,放置圖形項,然后通過視圖來顯示。

#include"myitem.h" #include"myview.h"#include <QApplication> #include<QGraphicsScene> #include<QGraphicsRectItem> #include<QDebug> #include<QTransform> #include<QGraphicsView> #include <QTime>int main(int argc, char *argv[]) {QApplication a(argc, argv);//引用隨機數qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//創建場景對象QGraphicsScene scene;//設置場景大小scene.setSceneRect(-200, -150, 400, 300);for(int i = 0; i < 5; ++i) {MyItem *item = new MyItem;item->setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256));item->setPos(i * 50 - 90, -50);scene.addItem(item);}//創建視圖QGraphicsView view;view.setScene(&scene);//設置場景的前景色view.setForegroundBrush(QColor(255,255,0,100));//設置場景的背景圖片view.setBackgroundBrush(QPixmap("../graph_03/background.png"));//穿件視圖大小并顯示view.resize(500,400);view.show();return a.exec(); }

添加一個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_H

ok!效果馬上出來了。小方塊就會在圖中隨機運動了。就是這么簡單。


資源鏈接:
https://download.csdn.net/download/qq_21291397/12197372

總結

以上是生活随笔為你收集整理的QT 定时器与动画实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。