#include "DraggableLine.h" #include #include #include #include void DraggableLine::mousePressEvent(QGraphicsSceneMouseEvent* event) { QPointF pos = event->pos(); // 获取相对于项的坐标 QLineF currentLine = line(); if (isNearPoint(pos, currentLine.p1())) { draggingStart = true; offset = currentLine.p1() - pos; } else if (isNearPoint(pos, currentLine.p2())) { draggingEnd = true; offset = currentLine.p2() - pos; } else { // 如果没有点击控制点,可以处理其他逻辑或忽略 QGraphicsLineItem::mousePressEvent(event); return; } event->accept(); // 标记事件已处理 } void DraggableLine::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { if (draggingStart || draggingEnd) { QLineF currentLine = line(); QPointF newPos = event->pos() + offset; // 计算新的端点位置 if (draggingStart) { currentLine.setP1(newPos); } else { currentLine.setP2(newPos); } setLine(currentLine); // 更新线段 scene()->update(); // 请求重绘 event->accept(); } else { QGraphicsLineItem::mouseMoveEvent(event); } } void DraggableLine::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { draggingStart = false; draggingEnd = false; QLineF currentLine = line(); qDebug() << "线段长度:" << currentLine.length(); QGraphicsLineItem::mouseReleaseEvent(event); } void DraggableLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { // 先调用基类方法绘制线段 QGraphicsLineItem::paint(painter, option, widget); // 绘制起点和终点的控制点 painter->setBrush(Qt::red); painter->drawEllipse(line().p1(), 5, 5); painter->setBrush(Qt::blue); painter->drawEllipse(line().p2(), 5, 5); } bool DraggableLine::isNearPoint(const QPointF& pos, const QPointF& point) const { QLineF line(pos, point); return (line.length() < 20); // 10像素范围内判定为点击控制点 }