#include "graphicsItem/electricSvgItem.h" #include "graphicsItem/itemControlHandle.h" #include #include #include #include ElectricSvgItem::ElectricSvgItem(const QRect &rect, bool autoGenPort,QGraphicsItem *parent) : GraphicsProjectModelItem(parent),m_pRender(nullptr) { m_lastBoudingRect = rect; m_boundingRect = rect; m_dWidth = rect.width(); m_dHeight = rect.height(); setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); setFunctionHandleEnaable(false); } ElectricSvgItem::ElectricSvgItem(const ElectricSvgItem& obj) : GraphicsProjectModelItem(obj) { m_lastBoudingRect = obj.m_lastBoudingRect; m_boundingRect = obj.m_boundingRect; m_dWidth = obj.m_dWidth; m_dHeight = obj.m_dHeight; _tempSvg = obj._tempSvg; setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); setFunctionHandleEnaable(false); if(!_tempSvg.isEmpty()) m_pRender = new QSvgRenderer(_tempSvg); } ElectricSvgItem::~ElectricSvgItem() { if(m_pRender) delete m_pRender; } ElectricSvgItem* ElectricSvgItem::clone() const { return new ElectricSvgItem(*this); } QPainterPath ElectricSvgItem::shape() { QPainterPath path; path.addRect(m_boundingRect); return path; } void ElectricSvgItem::updateCoordinate() //当执行了resie和editShape函数后,boundingRect发生了变换,需要将item的原点(以中心点为原点)校准至boundingRect.center() { if (!parentItem()) { QPointF pt1, pt2, delta; pt1 = mapToScene(QPointF(0, 0)); pt2 = mapToScene(m_boundingRect.center()); delta = pt1 - pt2; prepareGeometryChange(); //将boundingRect设置成中心点和原点(也是默认变换原点),这样三点重合,有助于简化计算 m_boundingRect = QRectF(-m_dWidth / 2, -m_dHeight / 2, m_dWidth, m_dHeight); //setTransformOriginPoint(m_boundingRect.center()); //变换中心默认为item的(0,0)点,所以不执行这句话也没有问题 //更新bouondingRect后重回会显示位置会有变化,需要做对应的移动 moveBy(-delta.x(), -delta.y()); updateHandles(); } m_lastBoudingRect = m_boundingRect; } void ElectricSvgItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { if(m_pRender) { m_pRender->render(painter,m_boundingRect); } painter->setPen(m_pen); painter->setBrush(m_brush); if(m_state == S_prepareConnect) { painter->setPen(QPen(QColor(255,51,153,180))); painter->drawLine(m_beginConnectPoint,m_endConnectPoint); } if(m_touched) { painter->setPen(QPen(QColor(238,58,140,220))); painter->drawRect(m_boundingRect); } if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框 { renderSelectBackground(painter); } } void ElectricSvgItem::resize(int nHandle,double dSX, double dSY, const QPointF& basePoint) { switch (nHandle) { case H_left: case H_right: dSY = 1; //拖拽的是左点右点,为水平缩放,忽略垂直变化 break; case H_top: case H_bottom: dSX = 1; //拖拽的是顶点底点,为垂直缩放,忽略水平变化 break; default: break; } QTransform trans; //缩放是以图元原点(中心)位置为基准,所以每帧都先移动移动到想要的基准点,缩放之后再移回 trans.translate(basePoint.x(), basePoint.y()); trans.scale(dSX, dSY); trans.translate(-basePoint.x(), -basePoint.y()); prepareGeometryChange(); m_boundingRect = trans.mapRect(m_lastBoudingRect); m_dWidth = m_boundingRect.width(); m_dHeight = m_boundingRect.height(); updateHandles(); } void ElectricSvgItem::move(const QPointF& point) { moveBy(point.x(), point.y()); } void ElectricSvgItem::loadSvg(QByteArray b) { if(m_pRender == nullptr){ m_pRender = new QSvgRenderer(b); } else{ m_pRender->load(b); } _tempSvg = b; update(); } void ElectricSvgItem::updateMapSvg(QMap map) { m_mapSvg = map; } void ElectricSvgItem::editShape(int nHandle,const QPointF& ptMouse) { prepareGeometryChange(); updateHandles(); }