首页 > 其他分享 >QGraphicsItem::paint经验记录

QGraphicsItem::paint经验记录

时间:2022-12-17 17:46:18浏览次数:42  
标签:原点 记录 缩放 paint 绘图 QGraphicsItem 绘制 坐标系 painter

前言

  QWidget、QPixmap以及QImage是绘图设备,使用painter可在上面绘图,绘图设备使用物理坐标系,左上角为(0,0),可设置视口决定在哪里显示绘图,物理坐标系的负坐标轴部分不能显示。
  painter->drawRect()等传入的是逻辑坐标,默认逻辑坐标系的原点和物理坐标系重合,逻辑坐标系可以平移、旋转、缩放等坐标系变换,平移可以移动坐标系,逻辑坐标系的负坐标轴区域也可以用于绘图。设置setViewport()决定了要显示逻辑坐标系中的哪部分区域,传入的参数为逻辑坐标。

  窗口与视口的解析在上篇博客中已记录不再详述,本篇博客主要记录在QGraphicsItem::paint()中绘图,重点在QGraphicsItem的坐标和绘图的坐标系的关系。在绘图时总是参考Item的位置来绘图,或者绘制在Item内部或者外部等,因此区分paint绘制的坐标系和item的局部坐标系很重要。

paint坐标系和item坐标系

QGraphicsItem的坐标系

  在QGraphics体系中,Item自身存在局部坐标系,通过item->setRect(x,y,w,h)可设置item在局部坐标系中的位置和大小,通过setPos(x,y)可设置item的局部坐标系原点在父坐标系中的位置。具体的关系如下图所示:

  因此item在父类坐标系中的绝对位置是由pos和rect决定的。在使用时,常常将item的局部坐标转移到pos上,这样更利于操作。计算在父类坐标系中的位置时可以如此获取:

item->mapToParent(item->rect());
//或者
setPos(rect.x(), rect.y());
setRect(0,0,rect.width(),rect.height());

QGraphicsItem::paint绘制的坐标系

  QgraphicsItem::paint类似于QWidget::paintEvent。函数原型如下所示:
C++ void QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  QPainter绘图坐标系的原点默认在Item::pos()处,x轴向右,y轴向下,与Item的局部坐标系重合。绘图坐标系可通过painter->translate(offset)实现坐标系的平移。
  绘图坐标系可使用translate rotate scale实现坐标系变换,使用时需要注意的是:translate移动的是坐标系原点,rotate是坐标系原点不动,旋转绘图坐标系,scale是坐标系原点不动,缩放绘图坐标系。旋转和缩放常常需要使用平移先移动坐标系,保证坐标原点处的位置不会随着旋转或者缩放而移动位置,这主要是为了确保绘制的图形或者文字在预想的区域(如矩形内)。
  缩放。缩放时,从x或者y方向上看,坐标系原点不动,而其余的点则远离或者靠近原点,坐标原点不动指的是绘图坐标系的原点在Item中的位置不动。在使用时,如果矩形不在局部坐标系的原点处,可以先将坐标系移动到矩形的左上角,而后执行缩放。由于坐标系已经发生了移动,最后绘制文字时文字的坐标就需要设置为(0,0),而文字的尺寸应该设置为文字缩放前的宽度和高度。

painter->translate(30,20);//将painter的逻辑坐标系移动到矩形所在的位置
painter->scale(sx,sy);//缩放逻辑坐标系
painter->drawText(QRect(0,0,textWidth,textHeight), text, Qt::AlignLeft|Qt::AlignTop);//坐标系发生变化,因此文字的绘制区域也要变

或者可先将坐标系移动到矩形左上角,执行缩放,而后再移动回去,最后绘制文字。这样做可以接着之前的内容进行绘制,只不过在绘制文字的时候,绘制坐标要变为矩形的左上角点的位置。在将坐标系移动回去后,坐标系的所有点中,只有缩放时的坐标原点(现在的(30,20)点)相对于Item的相对位置没有改变。

painter->translate(30,20);//将painter的逻辑坐标系移动到矩形所在的位置
painter->scale(sx,sy);//缩放逻辑坐标系
painter->translate(-30,-20);//将painter的逻辑坐标系移动原位
painter->drawText(QRect(30,20,textWidth,textHeight), text, Qt::AlignLeft|Qt::AlignTop);//坐标系发生变化,因此文字的绘制区域也要变

  旋转。旋转时,坐标系原点相对于Item的位置不动,其余点发生旋转。因此若要以矩形的中心点旋转文字,则先将坐标系移动到矩形中心点,在绘制文字时将文字的中心与坐标系原点重合,并且设置为居中绘制即可。

painter->drawLine(0, 0, 100, 0);//绘制坐标系
painter->drawText(100, -2, "x");
painter->drawLine(0, 0, 0, 100);
painter->drawText(-2, 100, "y");

painter->translate(curRect.center());//将绘制坐标系移动到矩形中央
painter->rotate(90);//旋转90度

painter->setPen(Qt::red);//绘制坐标系
painter->drawLine(0, 0, 100, 0);
painter->drawText(100, -2, "x");
painter->drawLine(0, 0, 0, 100);
painter->drawText(-2, 100, "y");

painter->drawText(QRectF(-50, -50, 100, 100), Qt::AlignCenter,"未定义");//绘制文字

绘制常用函数

  • save()和restore()
    用于保存和恢复painter当前的坐标变换以及设置的颜色属性等。有时候为绘制比较复杂图形使用了坐标变换,而绘制完成后需要恢复最初的状态接着绘制下一个图形,此时就有必要使用save和restore了。

标签:原点,记录,缩放,paint,绘图,QGraphicsItem,绘制,坐标系,painter
From: https://www.cnblogs.com/wsw2022/p/16989248.html

相关文章

  • Gorm源码学习-创建行记录
    1.前言Gorm源码学习系列Gorm源码学习-数据库连接此文是Gorm源码学习系列的第二篇,主要梳理下通过Gorm创建表的流程。 2.创建行记录代码示例gorm提供了以下几个接......
  • 打印tensorboard记录的数据(解决tf2下的问题)
    读取并导出Tensorboard中数据读取tensorboard日志数据代码fromtensorboard.backend.event_processingimportevent_accumulator#加载日志数据ea=event_accumulator......
  • 微信小程序入门记录
    0.基础认识本质上就是仅支持微信环境的网页,其使用的wxml即html,wxss即css和js即js。但也由于微信api的加持使得开发更为简单(注册登录和支付等api)。注意:小程序的逻辑层和......
  • 一次性能调优记录:压测报错out of memory内存溢出【杭州多测师_王sir】【杭州多测师】
    一次性能调优记录:压测报错out of memory内存溢出1、首先这是一段压测的报错日志截图2、服务器的配置还不错,执行机全64核以上,运存256g以上,服务器80核,512g,所有机器线程数......
  • vue3项目,记录我是如何用1h实现产品预估1天工作量的界面需求
    最近在编写前端界面,硬是一人一周时间加班加点写完了一个项目的前端界面(一级菜单有12个页面+一个控制台大屏,二三级界面有N个),之前预估前端界面的编写需要一个月,我是自己......
  • QGraphicsItem::paint()中文字绘制与缩放
    需求在QGraphicsRectItem上绘制文字,有下述要求:文字能够随着Item的尺寸的变化而缩放若增加文字则要按照拉伸或者压缩后的比例增加或者删除文字实现思路  实现文字......
  • linux学习记录
    linux学习记录快捷键Tab:命令补全,当你忘记某个命令的全称时可以只输入它的开头的一部分,然后按下Tab键就可以得到提示或者帮助完成。Ctrl+c:强行终止当前程序。Ctr......
  • Vim 学习记录
    Vim学习记录 Vim的三种主要模式:普通模式在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反......
  • 记录--三分钟打造自己专属的uni-app工具箱
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助介绍可曾想过我们每次创建新项目,或者换地方写程序,都要把之前写过的工具类找出来又要复制粘贴一遍有些麻......
  • spring boot 配置记录
    1.spring-retry spring-retry 是Spring中的提供的一个重试框架,提供了注解的方式,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。使用步骤:a)添......