目录

  • 前言
  • 一、关于GraphicsView、GraphicsScene和GraphicsItem三个坐标系的建立
  • 二、如何绘制背景网格?
    • 1.使用drawBackground函数
    • 2.绘制背景网格需要避的坑
  • .总结

前言

没用的文章千篇一律,我们的目标是不浪费读者时间,与读者一起成长进步~

一、关于GraphicsView、GraphicsScene和GraphicsItem三个坐标系的建立

首先,对于网上千篇一律关于GraphicsView、GraphicsScene和GraphicsItem坐标系的描述这里就不在赘述了,这里想要说明在实际应用中如何去建立这三个坐标系的对应关系来更方便地操控图形项。

1、GraphicsView的坐标原点(0,0)是在视图View的左上角,GraphicsScene的坐标原点(0,0)是在场景Scene的中心位置,即矩形/正方形的中心,场景Scene的左上角坐标是负值,其坐标值为场景Scene矩形宽和高的一半。GraphicsItem即图形项的坐标原点(0,0)一般是图形项的中心位置,默认场景原点与图形原点重合,但是我添加的图片的坐标原点是图片的左上角,不知道为什么~~~

2、对于如何设置这三个坐标系这里有几点建议:

①.尽量保证视图View的尺寸大于等于场景Scene的尺寸,因为这样可以把场景Scene中的图形项全部显示在视图View中;

②.在设置场景矩形rect时,尽量把场景矩形rect的左上角坐标设置成(0,0),长宽设置成与视图View长宽相等,这样就相当于把场景Scene的坐标原点(0,0)转移至左上角,与视图View坐标系的原点(0,0)重合,至于为什么要这么做,这里我踩过很多坑 - -  。例如设置图形项旋转中心时,如果以场景Scene默认的坐标原点设置,那么设置的旋转中心位置大概率跟你想的位置有偏差,这里亲自试一下就知道了,这只是其中一个坑,后面还会有很多坑要踩~~~

③.使用setPos(x,y)函数设置Item图形项的坐标时,该坐标是基于场景Scene的坐标原点的。

二、如何使用背景网格?

1.使用drawBackground函数

首先我们需要新建一个继承自QGraphicsScene的子类DrawBackGroud,然后在DrawBackGroud.h中声明虚函数drawBackground函数:

virtual void drawBackground(QPainter *painter, const QRectF &rect);

在DrawBackGroud.cpp中重写实现drawBackground函数:

//该函数在创建Scene的时候会自动调用
void DrawBackGroud::drawBackground(QPainter *painter, const QRectF &rect)
{Q_UNUSED(rect);/*设置画笔属性*/QPen pen;pen.setColor(QColor(60,60,60));pen.setWidth(2);painter->setPen(pen);right = Global_param::View_right-2;   //这里视图View的宽和高是QRect类型      bottom = Global_param::View_bottom-2;//绘制y方向网格,这里每间隔50个像素点绘制一次for(int i=1; i<=bottom+1; i = i+50){painter->drawLine(0, i, right+2, i);}//绘制x方向网格,这里每间隔50个像素点绘制一次for(int i=1; i<=right+1; i = i+50){painter->drawLine(i, 0, i, bottom+2);}update();}

2.绘制背景网格需要避的坑

注意:由于drawBackground函数的其中一个参数rect为暴露矩形这个参数会随着场景中图形项的改变,场景矩形的改变,还有一些其他东西的改变而改变,因此使用这个参数作为标准进行绘制背景网格很容易出问题,这里建议使用全局变量,详细说明如下:

①、将视图View的尺寸及对应坐标赋值给全局变量,方便在其他类中使用;

②、在绘制背景网格时使用视图View的尺寸进行绘制,这样可以保证绘制的网格不会随意变动,而且网格可以填满View。

③、当场景有任何改变时drawBackground函数都会自动调用,如果使用默认的视口更新模式,当移动或者旋转场景中的图形项时,背景网格很容易被破坏掉,这里推荐使用如下视口更新模式:

ui->View->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);   //设置视图更新模式,如果使用默认更新模式(最小更新模式),则改变Item状态,背景网格会被破坏

这里的ui->View为我设置的视图View,大家可根据自己的代码进行相应调整。

这里还需要注意的是,当放缩整个视图View时,背景网格也会跟着一起被放缩,如果此时想让背景网格大小保持不变,有几种思路:

1、 根据视图View的放缩倍数scale,在绘制背景网格时按照1/scale进行绘制,这种方法我再使用时有些小问题,大家可以试一下~

2、新建label组件,设置label组件与视图View的大小和坐标重合,然后把网格图片添加到label组件中,把label组件设置为放到视图View图层的后面一层,关键一步,把视图View的背景设置成透明即可显示label中的网格,亲测有效!!!

 ui->View->setStyleSheet("background:transparent");    //设置顶层背景透明,即把View放在label上层,将View背景设置为透明,即可显示下面的label网格

总结

以上是我在使用GraphicsView框架时踩的一些小坑,希望大家不要踩我踩过的坑~

第一次写博客没什么经验,写的也比较差,希望大家在看的时候多多包涵~~~后续如果有时间还会继续更新关于GraphicsView的一些内容,See you~

如何避坑GraphicsView------小白鼠的养肥之路~相关推荐

  1. Ubuntu 20.04从安装到配置全套避坑指南

    目标:把一台虚拟机设置成网络服务器+啥都能干的电脑 目录 虚拟机的安装 虚拟机的基本配置 一.换源 二.安装vmtool(仅限于在上一步不听话取消更新的同学) 三.安装nginx(听话的同学) 四.安 ...

  2. jeecg-boot 入门-小白避坑篇

    目录 一.jeecg-boot 入门 二.jeecg-boot 框架知识点 2.0 jeecg-boot 主题色修改 2.1 jeecg数据库表-字段规范 2.2 j-dict-select-tag ...

  3. Python~Pandas 小白避坑之常用笔记

    Python~Pandas 小白避坑之常用笔记 提示:该文章仅适合小白同学,如有错误的地方欢迎大佬在评论处赐教 文章目录 Python~Pandas 小白避坑之常用笔记 前言 一.pandas安装 二 ...

  4. 买笔记本电脑如何避坑之接口篇

      现在笔记本电脑成了和手机一样的刚需,无论是上大学还是日常工作,基本上是人手一台.那么对于那些非计算机专业或不懂电脑的小白来说,很容易买回来与自己需求不符合的电脑.一般电脑会使用很多年,5-7年,之 ...

  5. MySql 之 left join 避坑指南

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:MageekChiu https://segmentfaul ...

  6. 只要你的AI算法能比小白鼠聪明,DeepMind的这20万奖金请拿走

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 用你的AI算法和小白鼠一较高下,还能赢得3万美元(20万元)奖金. 稳赚?快别这么想. 实际情况是,机器学习算法一般都是在给定条件的任务中 ...

  7. 17条避坑指南:一份来自谷歌的数据库经验贴

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://medium.com/@rak ...

  8. 基础实验中的抗体选择过程和避坑Tips

    基础实验中,抗原抗体结合反应是我们很常运用的一个原理,像免疫组化.免疫荧光.免疫印迹试验(Western Blot).ELISA等都是常见又很重要的几种实验.而实验的关键步骤,就在于抗体的选择.抗体选 ...

  9. 0基础自学Python,有哪些避坑经验?

    回顾自己近 2 年的Python 自学经历,有一些学习心得和避坑经验分享给大家,让大家在学习 Python 的过程中少走一些弯路!减少遇到不必要的学习困难! 首先,最开始最大的困难应该就是对编程的抵触 ...

  10. mysql left join第一个_MySQL 之 LEFT JOIN 避坑指南

    现象 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对join.on.where等关键字的不 ...

最新文章

  1. Delphi 正则表达式语法(3): 匹配范围
  2. 计算机组装与维修单元卷,计算机组装与维修期中考试试卷及答案
  3. 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
  4. 几种简单的滤波方式(未完)
  5. Communications link failure
  6. 【风控场景】互利网上数字金融典型场景: 消费金融
  7. 小程序 常用快捷键
  8. 安装版mysql错误2_【gem安装】mysql2错误
  9. MySQL5.7的配置文件
  10. JAVA中super和this关键字的区别
  11. 推荐系统实践---第一章:好的推荐系统
  12. 信息学竞赛 c语言 pascal,pascal信息学竞赛教程
  13. ESD笔记(一)_ESD基础
  14. Python(TensorFlow框架)实现手写数字识别系统
  15. vuejs实现购物车满多少减多少
  16. 主磁盘分区和逻辑磁盘分区的区别是什么?
  17. 拼多多api接口数据说明
  18. 开入量与开出量的一点总结
  19. caffe学习笔记2:net forward与backward
  20. 组策略 控制台登录计算机用用户,更方便的管理计算机!Windows组策略应用全攻略一...

热门文章

  1. 微软扩大与Meta的AI合作,强强联合,友商岌岌可危?
  2. 如何使用Keras fit和fit_generator(动手教程)
  3. 对于教育改革的一些省思
  4. cmd指令ie打开html文件,命令行调用 IE 浏览器打开指定网址
  5. Kafka高频面试题:夺命10连问
  6. 明翰英语教学系列之雅思篇V1.9(持续更新)
  7. 申城最浪漫的法国普卢旺司餐厅--Bistro Latitude
  8. html:制作简易京东导航栏
  9. excel跑数计算机卡,win7系统下使用excel表格很卡如何解决
  10. shell脚本-md5码