QGraphicsScene的碰撞检测

实现效果如下
这里写图片描述
图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);
}
  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值