QT图形视图框架:限制图形项不重叠

QVariant pixmapItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if ((change == ItemPositionChange || change == ItemPositionHasChanged) && scene()) // 控件发生移动
    {
        QPointF newPos = value.toPointF();
        QRectF rect(0, 0, scene()->width(), scene()->height());

        QList<QGraphicsItem *> list = collidingItems();//碰撞列表
        if(list.size() > 0)
        {
            QGraphicsItem * otherItem = list.first();
            QRectF otherItemRect = otherItem->boundingRect();
            QRectF otherRect = QRectF(otherItem->x(),otherItem->y(),otherItemRect.width(),otherItemRect.height());

            if(otherRect.contains(newPos))//左上角
            {
                QPointF tempPoint = otherRect.bottomRight() - newPos;
                if(abs(tempPoint.x()) > abs(tempPoint.y()))
                {
                    newPos.setY(otherItem->y() + otherRect.height() + 2);
                }
                else
                {
                    newPos.setX(otherItem->x() + otherRect.width() + 2);
                }
                this->setPos(newPos);
                return newPos;
            }

            QRectF thisRectF = boundingRect();
            QPointF nowPos = QPointF(newPos.x() + thisRectF.width(),newPos.y());
            if(otherRect.contains(nowPos))//右上角
            {
                QPointF tempPoint = otherRect.bottomLeft() - nowPos;
                if(abs(tempPoint.x()) > abs(tempPoint.y()))
                {
                    newPos.setY(otherItem->y() + otherRect.height() + 2);
                }
                else
                {
                    newPos.setX(otherItem->x() - thisRectF.width() - 2);
                }
                this->setPos(newPos);
                return newPos;
            }

            nowPos = QPointF(newPos.x(),newPos.y() + thisRectF.height());
            if(otherRect.contains(nowPos))//左下角
            {
                QPointF tempPoint = otherRect.topRight() - nowPos;
                if(abs(tempPoint.x()) > abs(tempPoint.y()))
                {
                    newPos.setY(otherItem->y() - thisRectF.height() - 2);
                }
                else
                {
                    newPos.setX(otherItem->x() + otherRect.width() + 2);
                }
                this->setPos(newPos);
                return newPos;
            }

            nowPos = QPointF(newPos.x() + thisRectF.width(),newPos.y() + thisRectF.height());
            if(otherRect.contains(nowPos))//右下角
            {
                QPointF tempPoint = otherRect.topLeft() - nowPos;
                if(abs(tempPoint.x()) > abs(tempPoint.y()))
                {
                    newPos.setY(otherItem->y() - thisRectF.height() - 2);
                }
                else
                {
                    newPos.setX(otherItem->x() - otherRect.width() - 2);
                }
                this->setPos(newPos);
                return newPos;
            }
        }
    }

    return QGraphicsObject::itemChange(change, value);
}

效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值