视图框架坐标解释:

图形项的位置是指图形项的原点在其父图形项或者场景中的位置。
可以使用setPos()函数来指定图形项的位置。如果,没有指定,它默认会出现在父图形项或者场景的原点处。

QGraphicsScene *pScene = new QGraphicsScene;
pScene->setSceneRect(QRectF(-200, -200, 400, 400));
 // 创建图元对象
Heart *pHeart = new Heart;  // 类Heart从QGraphicsItem继承过来
pHeart->setPos(-100, 0);
// 将图元加入到场景
pScene->addItem(pHeart);
 // 创建视图
QGraphicsView *pView = new QGraphicsView;
pView->setScene(pScene);
pView->resize(400, 400);

1. 场景的原点是(0, 0)点
2. pScene->setSceneRect(QRectF(-200, -200, 400, 400));这句设置scene的(-200, -200)点对应view的左上角(0, 0)点,但是只有在场景的矩形大于视口的矩形的时候,才对应视口的左上角(0,0)点。
注意:一般情况下视口和场景设置成一样大小,但是当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心                        同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐

3. setPos基于场景坐标系

使用自定义视图框架
一、QGraphicsItem要点 积累 
1.在创建QGraphicsItem子类的时候,想要实现自己绘图,一般是重新实现boundingRect()和paint()函数,如果不重新实现shape(),基类的实现将会退而使用 boundingRect()。
2.boundingRect()这个函数的返回值是一个QRectF(一个正方形的区域),当我们需要处理我们所写的MyItem接受到的某些事件(比如鼠标按下、拖动等)时,这些事件就被规定只能发生在这个返回的矩形区域    当中时才会起被接收到。(也就是说你可以在QRectF区域外画图,但是在QRectF区域外画的图,就不会接受到某些事件)
3.函数paint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*/*widget*/)所绘制的内容也只能在这个区域里面画,画我们某一个具体的Item的全部内容。
4.shape()所返回的就是我们所绘制的Item的大概形状。
5.在可能改变QGraphicsItem大小或者形状的时候,QGraphicsItem子类函数中先调用prepareGeometryChange();

二、QGraphicsView用法总结

QGraphicsView用以展示QGraphicsScene对象
QGraphicsView可以展示QGraphicsScene的全部,也可以展示其一部分
QGraphicsScene scene;
scene.addText("Hello, world!");

QGraphicsView view(&scene);
view.show();

设置视图中间点
centerOn();

确保某一点在视图中可见
ensureVisible();

默认视图大小
QGraphicsScene::itemsBoundingRect();

手动设置视图大小
setSceneRect();

设置显示风格

包括: 
- 设置显示区大小 
- 设置显示提示

QGraphicsScene scene;
  scene.addRect(QRectF(-10, -10, 20, 20));

QGraphicsView view(&scene);
  view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
  view.show();

改变视图窗口所在的QWidget

QGraphicsView拥有对窗口的所有权
访问QWidget
viewport()

替换QWidget(用OpenGL)
setViewport()

图像变换

旋转、缩放、转化(根据横纵坐标)
rotate(qreal angle);
scale(qreal sx, qreal sy);
translate(qreal dx, qreal dy);
shear(qreal sh, qreal sv);//剪切

键盘、鼠标控制

因为继承了 QGraphicsSceneEvent 类
选中、拖拽视图中的某一项
//响应开关
setInteractive(bool allowed)

自定义控制响应

继承 QGraphicsView
重写鼠标和键盘 事件响应器
Qt提供了 mapToScene() 和 mapFromScene() 用来视图中,点与点,点与区域,区域与区域之间的映射。

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

视图框架自定义和坐标说明相关推荐

  1. Qt 视图框架示例 Colliding Mice 的翻译

    目录名字 Qt 视图框架示例 Colliding Mice 的翻译 简介: Mouse Class 定义 Mouse Class 定义 The Main() 函数 Qt 视图框架示例 Collidin ...

  2. 【Qt】2D绘图之图形视图框架(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...

  3. 基于Qt5图形视图框架的“俄罗斯方块”

    Qt5 图形视图框架QGraphicsView 1.图形视图框架包含三大类:场景类(QGraphicsScene),视图类(QGraphicsView),图元类(QGraphicsItem): 2.对 ...

  4. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...

  5. 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo

    1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...

  6. Qt修炼手册6_图形:图形视图框架

    1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...

  7. 深入理解文档/视图框架体系_九宫格项目开发感悟

    1.项目起源以及采用文档/视图框架体系缘由 我们整天都在说:文档保存项目的数据并处理项目上的数据:视图通过关联获得文档的数据并进行可视化:主窗口框架接收外部事件消息并进行消息分配.这句口头禅感觉接触过 ...

  8. [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

    [Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...

  9. 201112阶段二qt图形视图框架

    目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...

最新文章

  1. 少年郎,你需要封装好的ViewPager工具类
  2. 数据中心用蓄电池解决方案
  3. JavaScript(四)——面向对象编程、BOM、DOM、表单验证、jQuery
  4. Android strings.xml中定义字符串显示空格
  5. 2020年灵活用工行业研究报告
  6. 如何在你的blog中添加炫酷的飘雪动画效果
  7. Qt+OpenCV配置教程(图解亲测)
  8. 《大数据工程师 面经 自己整理 面试题1--》
  9. TCP协议——SYN/ACK的使用以及滑动窗口机制
  10. 南京融时代 php,河西南,回不去的3万5时代
  11. STM8应用笔记STM8开发环境
  12. android 11.0禁用电源键(屏蔽关机短按长按事件)
  13. Nature | 基于细菌构建具有类真核细胞结构和功能的人工细胞
  14. Metasploit上使用RPC方式复现一个Linux提权漏洞
  15. (干货)微信小程序项目——泡泡云音乐day2
  16. 【计算机网络】——体系结构
  17. 数位板怎么用?刚开始使用数位板要从什么开始练习
  18. 基于MATLAB的教室人数统计系统
  19. Linux下安装SAProuter
  20. 人工智能真的值得 All-In 么?

热门文章

  1. 一节双曲型方程基于MATLAB的求解,双曲方程基于matlab的数值解法
  2. 通信工程项目管理如何控制成本
  3. C++文件流fstream相关操作
  4. acwing-小猫爬山
  5. verilog中tb仿真文件模板
  6. OSI七层模型基础知识及各层常见应用
  7. 逻辑回归(Logistic Regression)原理及Python实现
  8. Atom编辑器折腾记_(22)二次翻译快捷键【追加1.8新版本新增快捷键】
  9. hive URI ${systemjava.io.tmpdir%7D$%7Bsystemuser.name%7D
  10. 前端学习案例16-js中的HMR