QT(13):QGraphicsScene

一、QGraphicsScene

该类充当 QGraphicsItems 的容器。它与QGraphicsView一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义item。

管理item
QGraphicsScene 还提供了一些功能,可以有效地确定item的位置,并确定哪些item在场景的任意区域内可见。QGraphicsScene 没有自己的视觉外观,它仅管理项目。使用QGraphicsView可视化整个场景,也可以放大并仅查看场景的一部分。

若要向场景添加项,从构造 QGraphicsScene 对象开始。有两个选择:通过调用addItem()来添加现有的QGraphicsItem对象,或者可以调用更方便的函数addEllipse(),addLine(),addPath(),addPixmap(),addPolygon(),addRect(),或addText()之一,这些函数都返回指向新添加项的指针。使用这些函数添加的item的尺寸和item的坐标系有关,并且item的位置初始化为场景中的坐标(0,0)。

  • addEllipse
  • addItem
  • addLine
  • addPath
  • addPixmap
  • addPolygon
  • addRect
  • addRect
  • addRect
  • addWidget

然后,可以使用QGraphicsView可视化场景。当场景发生变化时(例如,当item移动或变换时),QGraphicsScene 发出 changed()信号。要删除项目,请调用removeItem()。

  • clear

  • clearSelection

  • removeItem,从场景中移除item及其所有子item。

  • changed,场景内容发生变化。

  • focusItemChanged,每当场景中的焦点发生变化时,参数是之前具有焦点的item、获得焦点的item、焦点变化的原因。

  • sceneRectChanged,每当场景矩形发生变化时,都会发出此信号。参数是新的场景矩形。

  • selectionChanged,每当选择更改时,都会发出此信号。

BSP索引算法来有效地管理item的位置
QGraphicsScene使用索引算法来有效地管理item的位置。默认情况下,使用 BSP(二进制空间分区)树,一种适用于大多数item保持静止(即不四处移动)的大型场景的算法。可以选择通过调用setItemIndexMethod()来禁用此索引。

边界矩形SceneRect
场景的边界矩形是通过调用setSceneRect()来设置的。项目可以放置在场景的任何位置,默认情况下场景的大小不受限制。场景矩形仅用于内部记录,维护场景的项目索引。如果未设置场景矩形,QGraphicsScene 将使用所有项的边界区域(由itemsBoundingRect()返回)作为场景矩形。但是,itemsBoundingRect()是一个相对耗时的功能,因为它通过收集场景中每个项目的位置信息来运行。因此,在大型场景上操作时,应始终设置边界矩形。

  • itemsBoundingRect,计算并返回场景中所有项的边界矩形。此函数通过遍历所有项目来工作,因此,对于大型场景来说可能会很慢。
  • height、width,场景矩形的height、width

获取item
QGraphicsScene最大的优势之一是它能够有效地确定item的位置。即使场景中有数百万个项目,items()函数也可以在几毫秒内确定项目的位置。items()有多个重载:一个用于查找特定位置(point)的项,一个用于查找位于多边形或矩形(rect)内部或与多边形或矩形相交的项,等等。返回item的列表按堆叠顺序排序,最上面的项是列表中的第一项。为方便起见,还有一个 itemAt()函数返回给定位置的最顶层项目。

QGraphicsScene 维护场景的选择信息。要选择项目,请调用setSelectionArea(),要清除当前选择,请调用 clearSelection()。调用selectedItems()以获取所有选定项的列表。

  • itemAt

  • items

  • selectedItems

  • collidingItems,返回与指定item冲突的所有项的列表。默认情况下,将返回其形状itrem的形状相交或包含在item形状内的所有项。

  • selectionArea

  • setSelectionArea,设置选择区域。将立即选择此区域内的所有item,取消选择外部的所有item。

  • views,返回显示此场景的所有视图的列表。

  • createItemGroup

事件处理和传播
QGraphicsScene 的另一个职责是传播来自QGraphicsView的事件。要将事件发送到场景,需要构造一个继承QEvent的事件,然后使用QCoreApplication::sendEvent()等方式发送该事件。event()负责将事件调度到各个item。一些常见事件由具体的事件处理程序处理。例如,按键事件由keyPressEvent()处理,鼠标按下事件由 mousePressEvent()处理。

键盘事件传递到焦点item。若要设置焦点item,可以调用setFocusItem(),传递接受焦点的item,或者item本身可以调用QGraphicsItem::setFocus()。调用focusItem()以获取当前焦点item。为了与widget兼容,场景还会维护其自己的焦点信息。默认情况下,场景没有焦点,并且所有键盘事件都将被丢弃。如果调用setFocus(),或者如果场景中的某个item获得焦点,则场景会自动获得焦点。如果场景具有焦点,hasFocus()将返回 true,并且键盘事件将转发到焦点item(如果有)。如果场景失去焦点(即有人调用clearFocus()),而item具有焦点,则场景将保留其item焦点信息,一旦场景恢复焦点,它将确保最后一个焦点item重新获得焦点。

对于鼠标悬停效果,QGraphicsScene 调度悬停事件。如果item接受悬停事件(见QGraphicsItem::acceptHoverEvents()),则当鼠标进入其区域时,它将收到GraphicsSceneHoverEnter事件。当鼠标继续在item区域内移动时,QGraphicsScene 将向其发送GraphicsSceneHoverMove事件。当鼠标离开item区域时,item将收到GraphicsSceneHoverLeave事件。

所有鼠标事件都将传递到当前鼠标抓取器item。如果item接受鼠标事件(见 QGraphicsItem::acceptedMouseButtons())并收到鼠标按下,则该item将成为场景的鼠标抓取器,直到在没有按下其他鼠标按钮时收到鼠标释放。调用mouseGrabberItem()来确定当前正在抓取鼠标的item。

  • hasFocus
  • clearFocus
  • setFocus,设置场景焦点
  • setFocusItem,设置场景的焦点项
  • invalidate,图层中的任何缓存内容都将无条件失效并重新绘制。可以使用此函数重载来通知场景背景或前景的更改。
  • render,可用于将场景的内容捕获到绘画设备上

二、枚举类型

enum QGraphicsScene::ItemIndexMethod:索引算法提供的索引,用于管理有关场景中item的位置信息。
QGraphicsScene::BspTreeIndex,应用二进制空间分区树。所有的物品定位算法都是接近对数复杂度的量级,通过使用二叉搜索。添加、移动和删除item是对数的。此方法最适合静态场景(即大多数item不移动的场景)。
QGraphicsScene::NoIndex,不应用任何索引。item位置具有线性复杂性,因为将搜索场景中的所有item。但是,添加、移动和删除item是在恒定的时间内完成的。此方法非常适合连续添加、移动或删除许多item的动态场景。

enum QGraphicsScene::SceneLayer:QGraphicsScene的渲染图层,绘制场景内容时,它会按顺序分别渲染每个图层。背景-item-前景。
QGraphicsScene::ItemLayer,item图层
QGraphicsScene::BackgroundLayer,背景图层
QGraphicsScene::ForegroundLayer,前景图层
QGraphicsScene::AllLayers,所有图层

三、属性

backgroundBrush,场景的背景画笔。
bspTreeDepth,BSP 索引树的深度。
focusOnTouch,item在接收触摸开始事件时是否获得焦点。
font,场景的默认字体。
foregroundBrush,场景的前景画笔。默认的前景画笔是Qt::NoBrush(即不绘制前景)。
itemIndexMethod,item索引方法。BspTreeIndex索引对于静态场景(即,item不会四处移动)最有效。对于动态场景或具有许多动画item的场景,禁用该索引。默认索引方法是BspTreeIndex。
minimumRenderSize,必须绘制item的最小视图转换大小。渲染场景时,宽度或高度(转换为目标视图)小于 minimumRenderSize()的任何item都不会渲染。设置此值可加快在缩小视图上渲染许多对象的场景的渲染速度。默认值为0。设置为0或负值,将始终呈现所有item。
palette,场景的默认调色板。
sceneRect,场景矩形。场景矩形定义场景的范围。主要用于确定视图的默认可滚动区域,以及用于管理项目索引。
stickyFocus,单击场景背景是否会清除焦点,默认情况下,此属性为false。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和引用\[2\]提供了关于Qt中使用QGraphicsScene的代码示例和说明。根据这些代码,可以看出Qt中确实有QGraphicsScene类,用于在界面中绘制图形和实现界面背景的优化。引用\[3\]中的代码也使用了QGraphicsScene来显示图像。因此,可以确定Qt中是有QGraphicsScene的。 #### 引用[.reference_title] - *1* [qt QGraphicsScene 简单例子](https://blog.csdn.net/wowocpp/article/details/109576623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Qt中使用QGraphicsScene重写drawBackGround绘制背景](https://blog.csdn.net/weixin_44530868/article/details/109232483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Qt中使用QGraphicsScene时出现的问题](https://blog.csdn.net/m0_50600895/article/details/116859174)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值