简述:
QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。当这些不知足需求时(例如:在一些复杂的工做流场景中),每每须要自定义,一般的作法就是继承 QGraphicsItem。
ide
自定义 QGraphicsItem
要实现自定义 item,须要覆盖 QGraphicsItem 的两个纯虚函数:函数
void paint() : 以本地坐标绘制 item 的内容测试
QRectF boundingRect() : 将 item 的外边界做为矩形返回由 QGraphicsView 调用以肯定什么区域须要重绘。
除此以外,可能还须要附加其余需求,例如:QPainterPath shape() - item 的形状 由 contains() 和 collidesWithPath() 用于碰撞检测。若是未实现,则默认为 boundingRect()。
使用信号/槽、属性机制:继承 QObject 和 QGraphicsItem(或直接继承 QGraphicsObject)
处理鼠标事件:从新实现 mouse***Event()
处理键盘事件:从新实现 key***Event()
处理拖放事件:从新实现 drag***Event()、dropEvent()
……blog
Bounding Rect 和 Shape
先来一张效果图,解释 Bounding Rect 和 Shape 的联系与区别:继承
Bounding Rect事件
将 item 的外边界定义为矩形,全部绘制必须限制在此区域内,QGraphicsView 使用它来肯定 item 是否须要重绘。ip
虽然 item 的形状能够是任意的(例如:直线、椭圆、矩形 ),可是 bounding rect 老是矩形,而且不受 item 变换的影响。get
Shape工作流
以本地坐标中的 QPainterPath 形式返回 item 的形状。形状可用于许多事情,包括:碰撞检测,命中测试以及 QGraphicsScene::items() 函数。it
shape() 默认实现调用 boundingRect() 返回一个简单的矩形形状,但子类能够从新实现该函数,以返回非矩形 item 更准确的形状。例如,一个圆形 item 能够选择返回椭圆形状,以便更好地进行碰撞检测。
shape() 由 contains() 和 collidesWithPath() 的默认实现调用。