前言
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 定时器与动画实现相关推荐

  1. 【Qt炫酷动画】demo02-仿苹果对话框淡入淡出的动画

    文章目录 1.效果 2.开发思路 3.代码 代码目录 代码实现 4.代码下载 1.效果 2.开发思路 m_ani->setPropertyName("windowOpacity&quo ...

  2. QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞

    运行环境为Window XP 利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞 实验内容与分析设计 利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞 实验步骤与调试过程 第一步 ...

  3. Qt Creator制作动画

    Qt Creator制作动画 制作动画 创建时间表 将动画绑定到状态 管理关键帧 浏览时间轴 设置关键帧值 观看动画 编辑缓和曲线 将缓和曲线附加到关键帧 自定义缓和曲线 编辑动画曲线 旋转项目 制作 ...

  4. Qt 中的动画(Animations)

    Qt 中的动画(Animations) Qt中的动画包含以下内容 States: 状态 Transitions: 过渡 Animations: 动画 概述 动画用户实现属性值缓慢变化到目标值,可以应用 ...

  5. 【Qt炫酷动画】专栏导航目录

    历时小半年,经过总结积累,详细剖析了Qt框架如何制作动画. 通过本专栏学习,可以学会如何diy窗体动画.控件动画 Qt动画 [Qt炫酷动画]专栏导航目录 [Qt炫酷动画]0.动画类简介 [Qt炫酷动画 ...

  6. CoreAnimation6-基于定时器的动画和性能调优

    基于定时器的动画 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只 ...

  7. 使用QT定时器遇到的问题

    问题描述: 程序上有槽函数触发频率变化的需求.在使用Qt定时器触发槽函数的过程中发现,每秒钟1000次没有问题,在每秒钟30~50次的情况下出现了延迟. 主体代码如下: std::chrono::ti ...

  8. 1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

     1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets prints ...

  9. QT+OpenCV照片动画风格转换

    前言 用OpenCV将摄像头采集到的图片转换成动画风格,加上了QT界面.这个小实验并不复杂,后面直接贴代码. 代码 在QT creator中建的工程,只上部分比较重要的代码了,其他都是一样的. mai ...

最新文章

  1. tomcat9扩展php 插件,Eclipse插件开发tomcat扩展
  2. 如何把视频压缩变小?视频压缩方法介绍
  3. 服务降级-启动时检查
  4. VS2010自定义新建文件模版
  5. A1078. 逆序对个数
  6. 基于ViSual Studio 2013 + MYSQL9_5302 + Navicat for MySQL9_5302的ATM自动存取款系统
  7. Linux脚本(1)__批量下载
  8. java list 泛型 转换_Java中List与数组互相转换
  9. 中国橡胶防老剂4020市场现状与投资预测报告(2022版)
  10. 从日志统计到大数据分析
  11. Freebase上的SPARQL查询
  12. MySQL数据误删恢复
  13. 4.1.1 网络层的功能(路由选择与分组转发、异构网络互连、拥塞控制)
  14. 【学习日志】2022.10.16 万用头文件 sstream C++进制转换
  15. nginx防火墙设置
  16. STM32F407的USART
  17. 计算机网络期末复习考点
  18. Go语言原生数据库操作(六)—— 数据库
  19. 手机摄像头驱动_前9月手机镜头12强名单曝光 7家出货量突破2亿颗
  20. 启动计算机时出现grub,win7开机出现grub引导修复教程

热门文章

  1. 转)使用C/C++扩展Python
  2. java lamda循环条件_Java lambda 循环累加求和代码
  3. [云炬创业基础笔记] 第三章测试1
  4. [:zh]<界面编程>任务二 用户注册界面设计[:]2018-01-24
  5. 成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!
  6. Go进阶(6): uuid生成及其作用
  7. C++Primer:Break、Continue、Goto、Try/异常处理
  8. 关于用Delphi开发的一些基本的套路
  9. scanf最好与fflush(stdin)配合使用
  10. 实验三 图的操作与实现