Qt自带例子chip解读

QGraphics系列中,Item的内容是绘制在Scene上然后映射到view上再显示出来给用户。boundingRect实际上是一个“君子协定”:它告诉了Scene实际上Item(要绘制/刷新)的大小,以方便Scene进行碰撞检测等管理。当然,既然是“君子协定”,那么你实际上在Item的paint中想绘制多大都没问题啊,反正Scene只认boundingRect提交上去的大小。这也是我疑惑的地方,现在才明白实际使用中boundingRect的大小实际上就是你要绘制的区域大小这样是最合适了。至于为什么是110还有70,这个是因为在创建的时候指定了,如下图:
Qt自带例子chip解读
至于boundingRect和shape之间的关系则参考:
https://www.cnblogs.com/klcf0220/p/10316510.html
为了方便我贴出其中的图:

Qt自带例子chip解读

摘抄其中一段话:
shape() 默认实现调用 boundingRect() 返回一个简单的矩形形状,但子类可以重新实现该函数,以返回非矩形 item 更准确的形状。
简单来说,shape就是boundingRect的升级版了,碰撞检测,命中测试用的。测量110和70方法如图:
Qt自带例子chip解读
而chip例子中的shape()函数中的(14,14,82,42)是这么来的(下图红色圈选区域):
Qt自带例子chip解读

好了,结案

 

不过,还有一个问题没搞明白。。。

在chip::paint()函数里面,在绘制文字那里(也就是芯片文字)是怎么计算出(170,180)这个坐标的???

代码如下:

Qt自带例子chip解读

图示如下:

Qt自带例子chip解读

scale真的很玄学,F1查看也只有一句话带过,基本相当于没有解释。

painter的绘制区域也是不限定的,一时间理解不了。

有缘的有心的读者可以指导一下,谢谢~

补充:跟踪了下源码,QPainter::scale(qreal,qreal)实际上调用了QTransform,如下:

Qt自带例子chip解读