实现效果如下
图1 移动的Item碰撞显示
图2 碰撞的Item都显示
使用Scene的碰撞检测函数
QList< QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
文档解释
Returns a list of all items that collide with item. Collisions are determined by calling QGraphicsItem::collidesWithItem(); the collision detection is determined by mode. By default, all items whose shape intersects item or is contained inside item's shape are returned.
The items are returned in descending stacking order (i.e., the first item in the list is the uppermost item, and the last item is the lowermost item).
可以查看一下collidingItems的源码
QList<QGraphicsItem *> QGraphicsScene::collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode) const
{
Q_D(const QGraphicsScene);//宏通过d_func()获取d指针
if (!item) {
qWarning("QGraphicsScene::collidingItems: cannot find collisions for null item");
return QList<QGraphicsItem *>();
}
// Does not support ItemIgnoresTransformations.
QList<collidingItems *> tmp;
//获取Scene全部范围的Item
const auto itemsInVicinity = d->index->estimateItems(item->sceneBoundingRect(), Qt::DescendingOrder);
for (QGraphicsItem *itemInVicinity : itemsInVicinity) {
//使用QGraphicsItem的碰撞检测函数测试返回值
if (item != itemInVicinity && item->collidesWithItem(itemInVicinity, mode))
tmp << itemInVicinity;
}
return tmp;
}
首先实现移动的Item碰撞显示
主要代码如下:
//重写mouseMoveEvent函数,当有碰撞Item时让其变色
void GraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *ev)
{
scene()->collidingItems(this).isEmpty() ?
setBrush(QBrush(QColor(0,191,255))) :
setBrush(QBrush(QColor(255,215,0)));
QGraphicsRectItem::mouseMoveEvent(ev);
}
实现碰撞的Item都显示
//重写paint
//由于paint是每次界面重绘都需要调用的函数,所以当2个Item碰撞时,两者都触
//发相同的函数(代码)所以两者都变色
void GraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
scene()->collidingItems(this).isEmpty() ?
setBrush(QBrush(QColor(0,191,255))) :
setBrush(QBrush(QColor(255,215,0)));
QGraphicsRectItem::paint(painter, option, widget);
}