视图框架自定义和坐标说明
视图框架坐标解释:
图形项的位置是指图形项的原点在其父图形项或者场景中的位置。
可以使用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都会被创建。
视图框架自定义和坐标说明相关推荐
- Qt 视图框架示例 Colliding Mice 的翻译
目录名字 Qt 视图框架示例 Colliding Mice 的翻译 简介: Mouse Class 定义 Mouse Class 定义 The Main() 函数 Qt 视图框架示例 Collidin ...
- 【Qt】2D绘图之图形视图框架(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...
- 基于Qt5图形视图框架的“俄罗斯方块”
Qt5 图形视图框架QGraphicsView 1.图形视图框架包含三大类:场景类(QGraphicsScene),视图类(QGraphicsView),图元类(QGraphicsItem): 2.对 ...
- Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...
- 【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo
1.简介 使用的主要类:QGraphicsTextItem.QGraphicsScene.QGraphicsView. QGraphicsTextItem继承自QGraphicsObject,而QGr ...
- Qt修炼手册6_图形:图形视图框架
1.前言 主要为了学习可以在GUI上有效显示或管理大量图形对象的API,以及进行显示.扩大.缩小等操作. 2.图形视图框架(Graphics View Framework) 图形视图框架使用BSP树算 ...
- 深入理解文档/视图框架体系_九宫格项目开发感悟
1.项目起源以及采用文档/视图框架体系缘由 我们整天都在说:文档保存项目的数据并处理项目上的数据:视图通过关联获得文档的数据并进行可视化:主窗口框架接收外部事件消息并进行消息分配.这句口头禅感觉接触过 ...
- [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)
[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主 发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...
- 201112阶段二qt图形视图框架
目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...
最新文章
- 少年郎,你需要封装好的ViewPager工具类
- 数据中心用蓄电池解决方案
- JavaScript(四)——面向对象编程、BOM、DOM、表单验证、jQuery
- Android strings.xml中定义字符串显示空格
- 2020年灵活用工行业研究报告
- 如何在你的blog中添加炫酷的飘雪动画效果
- Qt+OpenCV配置教程(图解亲测)
- 《大数据工程师 面经 自己整理 面试题1--》
- TCP协议——SYN/ACK的使用以及滑动窗口机制
- 南京融时代 php,河西南,回不去的3万5时代
- STM8应用笔记STM8开发环境
- android 11.0禁用电源键(屏蔽关机短按长按事件)
- Nature | 基于细菌构建具有类真核细胞结构和功能的人工细胞
- Metasploit上使用RPC方式复现一个Linux提权漏洞
- (干货)微信小程序项目——泡泡云音乐day2
- 【计算机网络】——体系结构
- 数位板怎么用?刚开始使用数位板要从什么开始练习
- 基于MATLAB的教室人数统计系统
- Linux下安装SAProuter
- 人工智能真的值得 All-In 么?
热门文章
- 一节双曲型方程基于MATLAB的求解,双曲方程基于matlab的数值解法
- 通信工程项目管理如何控制成本
- C++文件流fstream相关操作
- acwing-小猫爬山
- verilog中tb仿真文件模板
- OSI七层模型基础知识及各层常见应用
- 逻辑回归(Logistic Regression)原理及Python实现
- Atom编辑器折腾记_(22)二次翻译快捷键【追加1.8新版本新增快捷键】
- hive URI ${systemjava.io.tmpdir%7D$%7Bsystemuser.name%7D
- 前端学习案例16-js中的HMR