实现效果如下
这里写图片描述
图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);
}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐