赞
踩
- 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);
- }
效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。