前面也讲到Qt提供画图框架,经典MVC模型,也没有什么问题。但Qt仅提供框架性东西,很难落地,很难应用在实际项目当中,一般需要自己捋一遍,这样才能理解好
什么view,canvas都好理解,只要控制好职责范围,就能很好编写这两个派生类的代码,对应用而言,关键是Item的实现,理论上Item才是五彩斑斓的世界。
总体架构如下:
说人话版本:
变化最多的,也是Item
有几件事情,是要重新写的:
QRectF boundingRect() const
这个用于判断是否落在本区域,本区域范围由你自己定义,这里是返回QRect,也就是也还比较麻烦,比如我们希望不是落在Item的方形区域,实际需要希望落在Item的边缘(线条附近),但边缘不可能是Rect的
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *)
paint就是你要画的图形,最终展现出来的图形
这个比较麻烦的地方,是View的压缩比例改变之后,要如何展现的问题。还有就是要区分:鼠标滑过、正在编辑、选中状态、正在调整等几种状态如何展现的问题,还是比较麻烦
int type() const;
类型,这个仅仅是类型,根据不同类型处理是否可获得焦点、调整大小之类的
实际应该还有形状区分,往往要自己。同样的可移动,也有很多形状需要区分
对于所有的item,至少是存在如下几个属性:
1、大小(或线条粗细)
2、颜色
而大小,是很讨厌的,因为View存在很多种Scale的,最简单Scale=1,实际只要放开滚轮,这个值就很讨厌。
paint是指Scale的大小,在Scale很小的时候,往往是看不清楚,展现效果也很差(显示效果差,也可以解释下,但编辑的时候还是那么小,肯定体验很差),因此因此很难处理