#include "designAttach.h"
CBorderAttach::CBorderAttach(QList<QGraphicsItem *> item_list, QPointF offset, QRectF sel_rect, int attach_interval)
{
_offset = offset;
_sel_rect = sel_rect;
_attach_interval = attach_interval;
QRectF actual_rect = _sel_rect;
actual_rect.moveTopLeft(actual_rect.topLeft() + offset);
QRectF snap_rect = actual_rect;
snap_rect.adjusted(-_attach_interval, -_attach_interval, _attach_interval, _attach_interval);
QVector<CBorderLine> vec_border;
qreal x1, y1, x2, y2;
snap_rect.getCoords(&x1, &y1, &x2, &y2);
for (int i = 0; i < item_list.size(); i++)
{
QGraphicsItem* item = item_list[i];
QRectF item_rect = item->sceneBoundingRect();
CBorderLine line;
qreal left = item_rect.left();
if (x1 <= left && left <= x2)
{
double left_gap = qAbs(actual_rect.left() - left);
double right_gap = qAbs(actual_rect.right() - left);
if (left_gap <= _attach_interval)
{
line._dir = EBorder_Left;
line._pos = left;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
else if (right_gap <= _attach_interval)
{
line._dir = EBorder_Right;
line._pos = left;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
}
qreal right = item_rect.right();
if (x1 <= right && right <= x2)
{
double left_gap = qAbs(actual_rect.left() - right);
double right_gap = qAbs(actual_rect.right() - right);
if (left_gap <= _attach_interval)
{
line._dir = EBorder_Left;
line._pos = right;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
else if (right_gap <= _attach_interval)
{
line._dir = EBorder_Right;
line._pos = right;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
}
qreal top = item_rect.top();
if (y1 <= top && top <= y2)
{
double top_gap = qAbs(actual_rect.top() - top);
double bottom_gap = qAbs(actual_rect.bottom() - top);
if (top_gap <= _attach_interval)
{
line._dir = EBorder_Top;
line._pos = top;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
else if (bottom_gap <= _attach_interval)
{
line._dir = EBorder_Bottom;
line._pos = top;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
}
qreal bottom = item_rect.bottom();
if (y1 <= bottom && bottom <= y2)
{
double top_gap = qAbs(actual_rect.top() - bottom);
double bottom_gap = qAbs(actual_rect.bottom() - bottom);
if (top_gap <= _attach_interval)
{
line._dir = EBorder_Top;
line._pos = bottom;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
else if (bottom_gap <= _attach_interval)
{
line._dir = EBorder_Bottom;
line._pos = bottom;
if (!vec_border.contains(line))
{
vec_border.push_back(line);
}
}
}
}
_vec_border = vec_border;
}
QVector<CBorderLine> CBorderAttach::GetBorder(EBorder dir)
{
QVector<CBorderLine> vec_line;
for (int i = 0; i < _vec_border.size(); i++)
{
CBorderLine line = _vec_border.at(i);
if (line._dir == dir)
{
vec_line.push_back(line);
}
}
return vec_line;
}
QPointF CBorderAttach::Calculate()
{
QPointF calc_point = _offset;
if (_vec_border.size())
{
QVector<CBorderLine> vec_left_line = GetBorder(EBorder_Left);
qSort(vec_left_line);
QVector<CBorderLine> vec_right_line = GetBorder(EBorder_Right);
qSort(vec_right_line);
QVector<CBorderLine> vec_top_line = GetBorder(EBorder_Top);
qSort(vec_top_line);
QVector<CBorderLine> vec_buttom_line = GetBorder(EBorder_Bottom);
qSort(vec_buttom_line);
if (vec_left_line.size())
{
calc_point.setX(vec_left_line[0]._pos - _sel_rect.left());
}
else if (vec_right_line.size())
{
calc_point.setX(vec_right_line[0]._pos - _sel_rect.left() - _sel_rect.width());
}
if (vec_top_line.size())
{
calc_point.setY(vec_top_line[0]._pos - _sel_rect.top());
}
else if (vec_buttom_line.size())
{
calc_point.setY(vec_buttom_line[0]._pos - _sel_rect.top() - _sel_rect.height());
}
}
return calc_point;
}
qt5下自定义QGraphicsItem在场景中拖动吸附算法
2星 需积分: 50 121 浏览量
2020-09-28
15:56:53
上传
评论 9
收藏 2KB RAR 举报
sujinhuan88
- 粉丝: 2
- 资源: 10
- 1
- 2
前往页