123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #include "DraggableLine.h"
- #include <QGraphicsSceneMouseEvent>
- #include <QPainter>
- #include <QDebug>
- #include <QGraphicsScene>
- 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像素范围内判定为点击控制点
- }
|