Qt中如何改变三角形图形项的包围盒

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;
}

通过如上定义,我们相当于将三角形斜边上的中点作为第四个顶点,如下图所示。通过这样的定义便可以实现三角形自定义的边界(包围盒)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值