概述

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都会被创建,

原文链接: http://blog.csdn.net/seanyxie/article/details/6008213

QGrapicsScene类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

随机推荐

  1. [转]C#读写远程共享文件夹

    1.在服务器设置一个共享文件夹,在这里我的服务器ip地址是10.200.8.73,共享文件夹名字是share,访问权限,用户名是administrator,密码是11111111. 2.新建一个控制台 ...

  2. begoo——路由设置

    路由本质是URL与要为该URL调用的视图函数之间的映射表,其实就是你定义的使用那个URL调用那段代码的关系对应表. 首先看一下最简单的路由: package routers import ( &quo ...

  3. Delphi 正则表达式语法(4): 常用转义字符与 .

    Delphi 正则表达式语法(4): 常用转义字符与 . // \d 匹配所有数字, 相当于 [0-9] var   reg: TPerlRegEx; begin   reg := TPerlRegE ...

  4. UML类图几种关系的总结(转载 http://blog.csdn.net/tianhai110/article/details/6339565 )

    http://blog.csdn.net/tianhai110/article/details/6339565

  5. 2018 Multi-University Training Contest 1 - D Distinct Values (STL+双指针)

    题意:数量为N的序列,给定M个区间,要求对每个区间Li,Ri,都有al..r (l≤i<j≤r), ai≠aj.构造这个序列使其字典序最小. 分析:如果对于每个所给区间都暴力扫一遍,1e5的数据 ...

  6. HDU 4370 - 0 or 1 (SPFA+思维)

    题意:给一个N*N的矩阵C,和一个N*N的只由0和1组成的矩阵X. X满足以下条件: 1.X 12+X 13+...X 1n=1  2.X 1n+X 2n+...X n-1n=1  3.任意 i (1 ...

  7. Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info

    Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the ...

  8. 软件测试工程师的Linux之路(持续更新修正)

    软件测试工程师成长必经之路—Linux学习. 测试工程师不同于运维工程师,所以在对不熟悉Linux的测试人员来说,先了解一些Linux系统的基本操作,能顺利开展测试工作即可,在强迫自己使用,熟悉命令行 ...

  9. python项目 配置文件 的设置

    一项目目录: 二:默认配置settings的配置:config 文件 __inint__.py文件: #!/usr/bin/env python # -*- coding: utf-8 -*- # C ...

  10. Go语言学习之常量(The way to go)

    生命不止,继续go go go . 上一篇博客<Go语言学习之变量(The way to go)介绍了go中的变量,今天就介绍常量. const关键字 跟c++中一样,go中同样具有const关 ...