Bounding Rect 和 Shape 的联系与区别
Bounding Rect
将 item 的外边界定义为矩形,所有绘制必须限制在此区域内,QGraphicsView 使用它来确定 item 是否需要重绘。
虽然 item 的形状可以是任意的(例如:直线、椭圆、矩形 ),但是 bounding rect 总是矩形,并且不受 item 变换的影响。
shape
以本地坐标中的 QPainterPath 形式返回 item 的形状。形状可用于许多事情,包括:碰撞检测,命中测试以及 QGraphicsScene::items() 函数。
shape() 默认实现调用 boundingRect() 返回一个简单的矩形形状,但子类可以重新实现该函数,以返回非矩形 item 更准确的形状。例如,一个圆形 item 可以选择返回椭圆形状,以便更好地进行碰撞检测。
shape() 由 contains() 和 collidesWithPath() 的默认实现调用。
三角形绘图定义
其中mBoundingRect
为三角形的包围盒
QRectF rect = mBoundingRect;
QPointF triangle[3]={QPointF(rect.topLeft().x(),rect.topLeft().y()),QPointF(rect.bottomLeft().x(),rect.bottomLeft().y()),QPointF(rect.bottomRight().x(),rect.bottomRight().y())};
painter->drawPolygon(triangle,3);
三角形的显示如下:其中右上半部分虽然看不见,但是进行碰撞检测时候却是利用整个矩形,而不是显示的三角形,而且当我们点击右上角空白部分时候,也会选中整个蓝色三角形。如何改变这种情况? 可以通过定义shape
来实现。
三角形边界定义
QPainterPath TriangleItem::shape() const
{
QPainterPath path;
QRectF rect = mBoundingRect;
QPolygonF rect_triangle;
rect_triangle << QPointF(rect.topLeft().x(),rect.topLeft().y()) << QPointF(rect.bottomLeft().x(),rect.bottomLeft().y()) << QPointF(rect.bottomRight().x(),rect.bottomRight().y()) << QPointF(rect.center().x(), rect.center().y());
path.addPolygon(rect_triangle);
return path;
}
通过如上定义,我们相当于将三角形斜边上的中点作为第四个顶点,如下图所示。通过这样的定义便可以实现三角形自定义的边界(包围盒)。