Как правильно создать хитбокс для линии в Qt
Я пишу простой редактор линий на Qt. Столкнулся с проблемой выделения конкретного объекта мышкой. Переопределив shape() я начал строить вокруг линии хитбокс в виде набора прямоугольников, но проблема в том что иногда эти прямоугольники получаются разной толщины или образуют разрывы. Есть ли какой-то метод создать хит бокс иначе. Линия представлена в виде набора точек и толщины. Также присутствует параметр sens который указывает дополнительный припуск для хитбокса.
QVector<QPoint> MyItem::CrtSegment(QPointF p0, QPointF p1)
{
float p0_x = p0.x(), p0_y = p0.y(), p1_x = p1.x(), p1_y = p1.y();
QRectF r_p0, r_p1;
r_p0 = QRectF(QPoint(p0_x + sens, p0_y - pen_width - sens), QPoint(p0_x - sens, p0_y + pen_width + sens));
r_p1 = QRectF(QPoint(p1_x + sens, p1_y - pen_width - sens), QPoint(p1_x - sens, p1_y + pen_width + sens));
QVector<QPoint> v;
if (p0_x <= p1_x)
{
if (p0_y <= p1_y)
v = { r_p0.topLeft().toPoint(),r_p1.topLeft().toPoint(),r_p1.bottomRight().toPoint(),r_p0.bottomRight().toPoint(),r_p0.topLeft().toPoint() };
if (p0_y > p1_y)
v = { r_p0.bottomLeft().toPoint(),r_p1.bottomLeft().toPoint(),r_p1.topRight().toPoint(),r_p0.topRight().toPoint(),r_p0.bottomLeft().toPoint() };
}
if (p0_x >= p1_x)
{
if (p0_y <= p1_y)
v = { r_p0.bottomLeft().toPoint(),r_p1.bottomLeft().toPoint(),r_p1.topRight().toPoint(),r_p0.topRight().toPoint(),r_p0.bottomLeft().toPoint() };
if (p0_y > p1_y)
v = { r_p0.topLeft().toPoint(),r_p1.topLeft().toPoint(),r_p1.bottomRight().toPoint(),r_p0.bottomRight().toPoint(),r_p0.topLeft().toPoint() };
}
return v;
}
QPainterPath MyItem::shape() const
{
QPainterPath path;
if(!points.isEmpty())
{
for(auto i = 1;i<points.size();i++)
{
path.addPolygon(QPolygon(CrtSegment(points\[i - 1\], points\[i\])));
}
}
return path;
}