#include "MyQGraphicsLineItem.h" MyQGraphicsLineItem::MyQGraphicsLineItem(QObject *parent) : QObject(parent) { } MyQGraphicsLineItem::~MyQGraphicsLineItem() { } bool MyQGraphicsLineItem::JudgeIsFeatruePoint(QPointF& mousePos) { QLineF mySelfScenePosLine = QLineF(this->scenePos().x(),this->scenePos().y(), this->scenePos().x() + (m_secondPoint.x() - m_firstPoint.x()), this->scenePos().y() + (m_secondPoint.y() - m_firstPoint.y())); double angle1 = mySelfScenePosLine.angleTo(m_levelLine); // 自己线和水平线之间的夹角 double angle2 = angle1 - m_rotateAngle; //旋转之后的终点和水平线之间的夹角 double lineLength = this->line().length(); double afterRoateSceneX = lineLength * cos(angle2 * PI_2 / H_ANGLE) + this->scenePos().x(); double afterRotateSceneY = lineLength * sin(angle2 * PI_2 / H_ANGLE) + this->scenePos().y(); //qDebug() << mousePos.x() << " " << afterRoateSceneX<<" " << mousePos.y() << " " << afterRotateSceneY; if (abs(mousePos.x() - afterRoateSceneX) <= FEATURE_POINT_SIZE && abs(mousePos.y() - afterRotateSceneY) <= FEATURE_POINT_SIZE) { return true; } return false; } void MyQGraphicsLineItem::SetLineItemAttr(QPointF& firstPoint, QPointF& secondPoint) { m_firstPoint = firstPoint; m_secondPoint = secondPoint; //设置水平线 m_levelLine.setP1(m_firstPoint); m_levelLine.setP2(QPointF(m_firstPoint.x() + 100, m_firstPoint.y())); //设置当前线位置 setPos(m_firstPoint); //设置ID m_id = GlobalDefine::GetInstance()->GetItemId(); } void MyQGraphicsLineItem::SetActualCoordAndUpdate(double actualP1DieCoordX, double actualP1DieCoordY, double actualP2DieCoordX, double actualP2DieCoordY) { m_actualP1DieCoordX = actualP1DieCoordX; m_actualP1DieCoordY = actualP1DieCoordY; m_actualP2DieCoordX = actualP2DieCoordX; m_actualP2DieCoordY = actualP2DieCoordY; m_firstPoint.setX(m_actualP1DieCoordX * DIE_SCALE); m_firstPoint.setY(m_actualP1DieCoordY * DIE_SCALE); m_secondPoint.setX(m_actualP2DieCoordX * DIE_SCALE); m_secondPoint.setY(m_actualP2DieCoordY * DIE_SCALE); //如果存在旋转必须归0,不然会存在新线段依然存在旋转 setRotation(0); m_rotateAngle = 0; this->setLine(0,0, m_actualP2DieCoordX * DIE_SCALE - m_actualP1DieCoordX * DIE_SCALE, m_actualP2DieCoordY * DIE_SCALE - m_actualP1DieCoordY * DIE_SCALE); setPos(0, 0); setPos(m_actualP1DieCoordX * DIE_SCALE, m_actualP1DieCoordY * DIE_SCALE); } double MyQGraphicsLineItem::GetStartAngle() { //qDebug() << m_firstPoint.x()<<" "<< m_firstPoint.y()<setPen(pen); painter->setBrush(Qt::blue); double featurePointX = 0.0; double freaturePointY = 0.0; line().p2().x() > line().p1().x() ? featurePointX = line().p2().x() - FEATURE_POINT_SIZE / 2 : featurePointX = line().p2().x() + FEATURE_POINT_SIZE / 2; line().p2().y() > line().p1().y() ? freaturePointY = line().p2().y() - FEATURE_POINT_SIZE / 2 : freaturePointY = line().p2().y() + FEATURE_POINT_SIZE / 2; painter->drawEllipse(QPointF(featurePointX, freaturePointY), FEATURE_POINT_SIZE / 2, FEATURE_POINT_SIZE / 2); } } void MyQGraphicsLineItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (m_isCoordAxis) { return; } if (event->button() == Qt::LeftButton) { emit signal_select(m_id); m_mousePressDownPos = event->scenePos(); m_isPressDown = true; m_isInFraturePoint = false; if (JudgeIsFeatruePoint(m_mousePressDownPos)) { m_isInFraturePoint = true; } } } void MyQGraphicsLineItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (m_isCoordAxis) { return; } if (m_isPressDown) { if (m_isInFraturePoint) { setTransformOriginPoint(this->scenePos() - this->scenePos()); QLineF mouseLine; mouseLine.setP1(this->scenePos()); mouseLine.setP2(QPointF(event->scenePos().x(), event->scenePos().y())); QLineF mySelfScenePosLine = QLineF(this->scenePos().x(), this->scenePos().y(), this->scenePos().x() + (m_secondPoint.x() - m_firstPoint.x()), this->scenePos().y() + (m_secondPoint.y() - m_firstPoint.y())); double angleNum = mySelfScenePosLine.angleTo(mouseLine); m_rotateAngle = angleNum; setRotation(-angleNum); } else { setPos(event->scenePos().x() , event->scenePos().y()); } } } void MyQGraphicsLineItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (m_isCoordAxis) { return; } if (event->button() == Qt::LeftButton) { m_isPressDown = false; m_isInFraturePoint = false; } }