温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++的QgraphicsScene类实例讲解

发布时间:2021-08-24 08:55:02 来源:亿速云 阅读:178 作者:chen 栏目:开发技术

这篇文章主要讲解了“C++的QgraphicsScene类实例讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++的QgraphicsScene类实例讲解”吧!

概述

QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的items,

QgraphicsScene提供了方便的函数来让你高效的找到items的位置,或者决定在scene上哪个item可以看到,配合QgraphicsView窗口,你可以让可见scene,或者缩放场景来可见一部分

例如:

QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();

注意:QgraphicsScene场景没有自己可见的外观,他只管理items,需要创建一个QgraphicsView Widget来让场景可见。

添加items到场景中,首先你要构造一个QGraphicsScene对象,然后,你有两个选择: 一是通过addItem函数,一是通过调用方便的函数 addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText(),   将会返回一个新添加的item的指针,添加到场景中的item大小和item本地坐标系统有关,初始化位置在场景中的(0,0)

当场景改变时候,例如转换item或者删除item时候,场景QgrapbhicsScene会发射change()信号,删除item,可以调用removeItem()

QgrapbhicsScene使用下标来高效的管理item的位置,默认的使用BSP树,适用于一个大型的场景,其中的item都是静止不变的,可以选择调用setItemIndexMethod().来禁用下标,可是查看itemIndexMethod来获取更多的信息

场景的边界可以使用setSceneRect()来设置,item可以放置在场景中任何位置,场景默认的大小是不受限制的,场景的矩形只用来做内部的簿记,管理场景中的item下标,如果场景矩形没有设置,QgrapbhicsScene将会使用所有item图元的边界,使用函数itemsBoundingRect()返回

QgrapbhicsScene一个巨大的功能是他可以高效的找到items的位置,即便是场景中有上百万个item,items()函数可以在数微秒内找到item的位置,items()有一些重载函数(省略)

ItemAt()函数可以根据提供的位置返回所在位置处的最上层的item

QgrapbhicsScene包含了场景的选择信息,选择items,可以使用setSelectionArea(),清除当前选择可以使用clearSelection(),调用selectedItems()来获取已经选择的items

事件处理和传播

QgrapbhicsScene另外一个责任是传播从QgraphicsView来的事件,发送事件给场景scene,可以继承QEvent构建一个事件,然后使用QApplication::sendEvent()来传递,event()函数负责分发给各个独立的items,一些普通的事件可以使用方便的事件处理函数,例如keyPressEvent()和mousePressEvent()

键盘事件发送给当前选择的item,设置选择的item,可调用setFocusItem(),将要选择的item作为参数传递进去,或者item自己调用函数QgraphicsItem::setFocus(),调用focusItem()来获取当前的选择的item,为了窗口的兼容性,场景也获取它自己的获取光标的信息,默认的,场景没有焦点,键盘事件也被忽略,如果函数setFocus()调用了,或者场景中一个item图元获得了焦点,场景也自动的获得了焦点,然后场景的hasFocus()函数返回真,键盘事件将会发送给选择的那个item,当场景丢失了focus,但是其中的item获得了焦点,那么这个场景也将获得这个item的焦点信息,如果场景要重新获取焦点,它将会把上次获得焦点的item重新获得item

对于鼠标移动效果,QgrapbhicsScene传递鼠标悬浮事件,如果其中的item设置了接受QGraphicsItem::acceptHoverEvents()事件(默认是忽略该事件的),它将会收到GraphicsSceneHoverEnter事件,GraphicsSceneHoverMove,GraphicsSceneHoverLeave事件

所有的鼠标事件都传送给当前鼠标拖动的那个item,当然也要item设置接受鼠标事件,看QGraphicsItem::acceptedMouseButtons(),

可以调用QGraphicsItem * QGraphicsScene::mouseGrabberItem () const来查看当前选择的item,该函数会返回选择的item的指针。

1、QGraphicsScene::setItemIndexMethod ( ItemIndexMethod method )

用来设置场景中item的下标的方法,QGraphicsScene对场景应用一个index算法,来加速查询item,例如items()和itemAt(),下标对于静态的场景很有用,对动态的场景,或者场景中有很多动画项目(animated items),使用下标来寻找item就不行了

一般情况下,默认的下标使用BSP树就能很好的工作,如果你的场景中使用了很多动画,可以禁用下标通过调用setItemIndexMethod(QGraphicsScene::NoIndexNoIndex)

2、QGraphicsScene::setSceneRect(const QRectF & rect)

用来设置场景的矩形区域,限定场景的边界

这个矩形限定了场景的范围,它首先使用QGraphicsView来确定试图的可卷动区域,使用QGraphicsScene来管理item下标

如果不设定矩形区域,或者设置一个空的矩形,QRect QGraphicsScene::FsceneRect() const会返回最大的边界,场景中所有的item都会被创建。

感谢各位的阅读,以上就是“C++的QgraphicsScene类实例讲解”的内容了,经过本文的学习后,相信大家对C++的QgraphicsScene类实例讲解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI