Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【QT】图形视图、动画框架

【QT】图形视图、动画框架

作者头像
半生瓜的blog
发布于 2023-05-13 05:57:52
发布于 2023-05-13 05:57:52
1.7K00
代码可运行
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog
运行总次数:0
代码可运行

Qt图形视图框架、动画框架

Qt提供了图形视图框架(GraphicsView Framework)、动画框架(The Animation Framework)、状态机框架(The State Machine Framework)来实现更加高级的图形与动画应用。使用这些框架可以快速设计出动态GUI应用和各种动画、游戏程序。

图形视图框架提供了基于图像项模型的模型视图编程方法,主要由场景、视图和图形项这三部分组成,这三部分分别由QGraphicsScene、QGraphicsView、QGraphicsItem这三个类来表示。

多个视图可以查看一个场景,场景中包含了各种几个形状的图像项。框架中包含一个事件传播架构,提供了和场景中的图形项进行精确的双精度交互能力,如将场景时间传递给图形项,也可以管理图形项目之间的事件传播。

图形项可以处理键盘事件,鼠标事件,如鼠标按下事件、移动、释放及双击事件,还可以跟踪鼠标的移动。

图形视图框架使用一个BSP(Binary Space Partitioning)树来快速发现图形项,正因为如此,可实时显示巨大的场景,甚至包括上百万个图形项。

场景、视图、图像项

场景

一个场景分为3层:图形项层、前景层。

场景绘制顺序:背景层->图像项层->场景层

场景作用:

  1. 提供用于管理大量图像项的高速接口;
  2. 传播事件到每一个图形项;
  3. 管理图像项的状态,如选择和处理焦点;
  4. 提供无变换的渲染功能,主要用于打印;

常用接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QGraphicsScene::setForegroundBrush()//设置前景刷
QGraphicsScene::setBackgroundBrush()//设置背景刷
QGraphicsScene::itemAt()			//返回指定坐标处最顶层的图形项
QGraphicsScene::selectedI tems()		//获取当前选取的所有图形项的列表
QGraphicsScene::setFocusItem()		//为图形项设置焦点
QGraphicsScene::focusItem()			//获取当前获得焦点的图形项
QGraphicsScene::render()			//将场景中的一部分渲染到绘图设备上
QGraphicsScene::setSelectionArea()	//传递一个任意形状来选择场景中指定的图形项

视图

QGraphicsView提供了视图部件,它用来使场景中的内容可视化。可连接多个视图到同一个场景来为相同的数据集提供多个视图,视图部件是一个可滚动的区域,提供了一个滚动条来浏览大场景。

常用接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QGraphicsView::setForegroundBrush()	//设置前景色
QGraphicsView::setBackgroundBrush()	//设置背景色
QGraphicsView::resize()		//重置视图大小
QGraphicsView::show()		//显示视图
QGraphicsView::setDragMode()		//拖动场景,常以QGraphicsView::ScrollHandDrag为参数使光标变为手掌形状,从而拖动场景,若以QGraphicsView::RubberBandDrag为参数可在视图上使用鼠标拖出橡皮筋框来选择图形项

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsView>

int main(int argc,char* argv[]){
    QApplication app(argc,argv);

    //新建场景
    QGraphicsScene scene;

    //创建矩形图形项
    QGraphicsRectItem *item = new QGraphicsRectItem(0,0,100,100);

    //场景添加图像项
    scene.addItem(item);

    //为场景创建视图
    QGraphicsView view(&scene);
    //设置场景前景色
    view.setForegroundBrush(QColor(255,21,23,100));
    //设置背景
    view.setBackgroundBrush(QPixmap("picture.jpg"));
    view.resize(400,400);
    view.show();


    return app.exec();
}

图形项

QGraphicsItem是场景中图像项的基类,图形项框架为典型的形状提供了标准的图像项,比如矩形QGraphicsRectItem、椭圆QGraphicsEllipseItem、文本QGraphicsTextItem,自定义图形项能发挥QGraphicsItem的强大功能。

图形项支持如下功能:

  1. 鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件
  2. 键盘输入焦点和键盘事件
  3. 拖放事件
  4. 分组,使用QGraphicsItemGroup通过parent-child关系来实现。
  5. 碰撞检测

常用接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QGraphicsItem::boundingRect()	//返回绘图区域
QGraphicsItem::paint()			//绘图操作

坐标系统

图形视图框架基于笛卡尔坐标系统,一个图像项在场景的位置和几何形状由X坐标和Y坐标来表示。图形视图框架中有3个有效的坐标系统;图形项坐标、场景坐标、视图坐标。

为方便使用,图像视图框架提供了一些便捷函数来完成3个坐标系统的映射,进行绘图时,场景坐标对应QPainter的逻辑坐标,视图坐标对应设备坐标。

图形项坐标

图像项使用自己的本地坐标系统,坐标通常以它们的中心为原点(0,0),而这也是所有变换的中心。当创建一个自定义的图形项时,只需要考虑图形项的坐标系统,QGraphicsScene和QGraphicsView会完成其它所有的转换。

图像项的位置是指图像项的原点在其父图像项或场景中的位置。如果没有图像项,则为顶层图像项,其均会在场景的坐标系统中。

所有的图像项都会使用确定的顺序来进行绘制,这个顺序也决定了单机场景时哪个图像项会先获得鼠标的输入。所有的图像项都包含一个z值来设置他们的堆叠顺序,一个图像项的z值默认为0,可使用QGraphicsItem::sizeZValue()来改变一个图像项的z值。

场景坐标

场景坐标是所有图形项的基本坐标系统,坐标的原点在场景的中心。

视图的坐标

视图的坐标就是部件的坐标,视图坐标的每一个单位对应一个像素,原点总是在QGraphicsView视口的左上角,而右下角是宽高。所有的鼠标事件和拖放事件都是使用视图坐标来接收的。

图形视图框架的映射函数:

事件处理与传播

图形视图框架中的事件都是由视图进行接收的,然后传递给背景,再由背景传递给响应的图像项。

对于键盘事件,会传递给获得焦点的图像项,若场景中没有获得焦点,则键盘事件被丢弃。可通过setFocus()获取焦点。

一个图像项可以接收悬停事件,当鼠标进入它的区域之中时,它就会收到一个QGraphicsSceneHoverEnter事件,鼠标在图像项的区域移动时,QGraphicsScene就会向该图像项发送GraphicsSceneHoverLeave事件,可通过QGraphicsItem::setAcceptHoverEvents()视图图像项接收悬停事件(默认不接收)。

碰撞检测

图像视图框架提供了图像项之间的碰撞检测,碰撞检测可以使用两种方法来实现:

1.重写QGraphicsItem::shape()函数来返回图像项准确的形状,然后使用collidesWithItem()接口通过两个图像项形状之间的交集来判断是否发生碰撞。如果没有重新实现shape()函数,则它会调用默认boundingRect()函数返回一个简单的矩形。

2.重写collidesWithItem()来提供一个自定义的图形碰撞算法。

collidesWithItem()判断是否与指定的图形项进行了碰撞;

collidesWithPath()判断是否与指定的路径碰撞;

collidingItems()获取与该图形项碰撞的所有图形项的列表;

下面这几个函数都有一个Qt::ItemSelectionMode参数来指定怎样进行图形项的选取,选取模式如下:

动画框架

动画框架的目的是提供一种简单的方法来创建平滑的、具有动画效果的GUI界面。该框架是通过控制Qt的属性来实现动画的,可以应用在窗口的部件和其他QOBject对象上,也可以应用在图像视图框架中。

动画框架的主要类关系图如下:

缓和曲线

使用 enum QEasingCurve::Type来设置缓和曲线,枚举值如下:

动画组

使用QAnimationGroup类可以实现复杂的动画,它的两个子类

QSequentialAnimationGroup,

QParalleAnimationGroup

分别提供了串行动画组和并行动画组。

状态机框架

状态机框架提供一些类来创建和执行状态图,状态图为一个系统如何对外界进行反应提供了一个图形化模型,该模型通过定义一些系统可能进入的状态以及系统怎样从一个状态切换到另一个状态来实现的。

Qt的事件系统来驱动状态机。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
9.5 QGraphicsView视图框架
Qt Graphics View 用于管理交互大量定制的 2D 图形对象,提供了可视化显示对象的视图 widget,并支持缩放和旋转功能。Graphics View 使用 BSP(二元空间划分)树形,可非常快速地找到图元对象,因此即使是包含百万个图元对象的大型场景,也能实时显示。Graphics View框架包含了一个事件传播构架,允许与场景中的图元进行交互。比如:可以处理键盘事件,鼠标移动、松开、双击事件,并且可以跟踪鼠标移动。Graphics View视图本身是一个基于item的M-V架构的框架,它的每一个组件都是一个item。
DS小龙哥
2022/01/12
6360
9.5 QGraphicsView视图框架
PyQt5中使用图元实现高效绘制场景
Qt图形视图框架(Qt Graphics View Framework)支持开发快速高效的2D矢量图形场景。场景可以包含数百万个对象,每个对象都有自己的功能和行为。通过使用 PyQt 的图形视图,您可以在 Python 中访问这个高性能的图形层。无论您是将矢量图形视图集成到现有的 PyQt 应用程序中,还是只是想要一个强大的 Python 矢量图形界面,Qt 的图形视图都是您正在寻找的。
OpenCV学堂
2024/05/10
2610
PyQt5中使用图元实现高效绘制场景
Qt中国象棋一—— Qt 2D 绘图入门
最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下。查了一些网上的资料,在此总结一下;我比较喜欢的方式是用到什么学什么,或者自己想做一个东西,这样学习起来目的性比较强,可以快速进入。
用户5908113
2019/10/29
1.9K0
PyQt5 图形项的定义和交互(一)
如果创建一个自定义的窗口部件并重新实现它的绘制事件,就可以得到任何想要的图形。但如果需要绘制大量的单个项,或者是需要绘制用户能够进行单独交互的项(例如选中、移动、复制粘贴...) ,又或者需要对项进行动画处理,使用PyQt的图形视图类(QGraphicsView)比重新实现一个窗口部件的绘制事件更方便一些。
用户6021899
2019/08/14
1.9K0
qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm
全栈程序员站长
2022/07/12
1.9K0
qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
Java一分钟之-Java图形绘制:Graphics2D与Shape
Java提供了强大的图形绘制功能,主要通过Graphics2D和Shape接口来实现。在本篇博文中,我们将探讨这两个关键组件,常见的问题,易错点以及如何避免它们。
Jimaks
2024/05/31
6620
基于qt的简单小游戏_中国象棋单机版2,0
最近对 Qt 这个跨平台 C++ 图形应用程序框架很感兴趣,闲暇时间多学了一下,收获很多,也踩了不少坑,在这里记录一下,分享心得。
全栈程序员站长
2022/09/27
1.2K0
基于qt的简单小游戏_中国象棋单机版2,0
Qt官方示例-拖放机器人
  Graphics View提供了QGraphicsScene类,用于管理从QGraphicsItem类派生的大量定制2D图形项目,并与之交互;还提供了QGraphicsView小部件,用于可视化项目,并支持缩放和旋转。
Qt君
2020/02/24
4.9K1
C++ Qt开发:Charts绘图组件概述
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts二维绘图组件的常用方法及灵活运用。
王瑞MVP
2023/12/23
1.7K0
C++ Qt开发:Charts绘图组件概述
QT应用编程: QGraphicsTextItem单击选中、双击进入编辑状态
最近做一个播放器的项目,需要用户自定义编辑定制视频的字幕;为了方便编辑字幕,这里QGraphicsTextItem需要支持任意拖动,回车确认,鼠标双击进入编辑状态,右键弹出菜单(剪切、复制、删除、全选)等操作。
DS小龙哥
2022/01/07
2.8K0
QT应用编程: QGraphicsTextItem单击选中、双击进入编辑状态
基于 Vue 和 Canvas,轻舟低代码 Web 端可视化编辑器设计解析 | 低代码技术内幕
自 2020 年来,网易数帆探索可视化低代码编程已两年有余,打造了轻舟低代码平台用于企业应用开发。然而,不少编程技术人员对这一领域还比较陌生。我们开设《低代码技术内幕》专栏,旨在讨论低代码编程领域中的困难、问题,以及高效的解决方案。本文为第二篇,结合我们的产品研发经验解读打造 web 端可视化代码编辑器需要权衡的因素以及技术实现的要点。 专栏内容回顾:低代码编程及其市场机遇剖析 | 低代码技术内幕   轻舟低代码平台是一款基于云服务的 web 端产品,面向零基础或者有一定编程基础的用户。用户不需要额外安装
深度学习与Python
2023/04/10
1.8K0
基于 Vue 和 Canvas,轻舟低代码 Web 端可视化编辑器设计解析 | 低代码技术内幕
Qt5实战第十四篇:Qt5的插件与扩展
在Qt5中,插件与扩展机制提供了一种灵活的方式,使得开发者可以在不修改主程序代码的情况下,增加或替换功能。这种机制广泛应用于图形界面、数据处理、文件格式支持等多个方面。本文将详细介绍Qt5中的插件机制,并通过一个示例来展示如何实现和使用插件。
china马斯克
2025/01/07
3170
OpenCV3 和 Qt5 计算机视觉:1~5
在最基本的形式和形状中,“计算机视觉”是一个术语,用于标识用于使数字设备具有视觉感觉的所有方法和算法。 这意味着什么? 好吧,这就是听起来的确切含义。 理想情况下,计算机应该能够通过标准相机(或与此相关的任何其他类型的相机)的镜头看到世界,并且通过应用各种计算机视觉算法,它们应该能够检测甚至识别并计数人脸。 图像中的对象,检测视频馈送中的运动,然后执行更多操作,这些操作乍一看只能是人类的期望。 因此,要了解计算机视觉的真正含义,最好知道计算机视觉旨在开发方法以实现所提到的理想,使数字设备具有查看和理解周围环境的能力。 值得注意的是,大多数时间计算机视觉和图像处理可以互换使用(尽管对这个主题的历史研究可能证明应该相反)。 但是,尽管如此,在整本书中,我们仍将使用“计算机视觉”一词,因为它是当今计算机科学界中更为流行和广泛使用的术语,并且因为正如我们将在本章稍后看到的那样,“图像处理”是 OpenCV 库的模块,我们还将在本章的后续页面中介绍,并且还将在其完整的一章中介绍它。
ApacheCN_飞龙
2023/04/27
6.1K0
【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
像上面示例中的,按钮、列表视图、树形视图、单行输⼊框,多行输入框,滚动条、下拉框等等都可以称为 “控件”
IsLand1314
2025/01/19
1.1K0
【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
(一) 3D图形渲染管线
渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景(如图1):
bering
2019/12/02
1.5K0
基于Qt的流程设计器(一)
一:先来看一下界面的截图: 说明: 拖动节点的时候,与该节点相关的箭头连线也会跟着调整; 用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标在空白区域点击一下,拖出的箭头消失) 这三个图标,手型
liulun
2018/01/12
1.9K0
基于Qt的流程设计器(一)
QT实现机器视觉最常用的图像查看器(源码)
在机器视觉行业中最常见的控件就是图像查看器了,使用QT实现其实也非常简单,在我出的项目【降龙:算法软件框架】和【重明:工业相机二次开发】中都有用到。可以说只要你要开发一个和机器视觉相关的软件,就离不开图像查看器。
周旋
2024/03/04
6970
QT实现机器视觉最常用的图像查看器(源码)
C++ Qt开发:Charts折线图绑定事件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts折线图的常用方法及灵活运用。
王瑞MVP
2023/12/25
5860
C++ Qt开发:Charts折线图绑定事件
【C++】Qt:Qt事件介绍与正弦曲线绘制示例
Qt 的事件机制是一种基于事件驱动的机制,用于处理用户输入、系统事件和自定义事件。
DevFrank
2024/07/24
3330
【C++】Qt:Qt事件介绍与正弦曲线绘制示例
【Python贪吃蛇】:编码技巧与游戏设计的完美结合
🚲turtle模块 Python的turtle模块是一个非常基础的绘图库,它允许用户创建一个画布并在上面绘制图形。这个模块通常用于教学目的,特别是适合初学者学习编程和理解基本的图形概念。 turtle的一些关键特性:
爱喝兽奶的熊孩子
2024/05/14
3380
【Python贪吃蛇】:编码技巧与游戏设计的完美结合
推荐阅读
相关推荐
9.5 QGraphicsView视图框架
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验