#include "graphicsItem/electricSvgGroup.h" #include "graphicsItem/electricSvgItem.h" #include #include #include ElectricSvgGroup::ElectricSvgGroup(const QRect &rect,QGraphicsItem *parent) : GraphicsProjectModelGroup(parent) { m_lastBoudingRect = rect; m_boundingRect = rect; m_dWidth = rect.width(); m_dHeight = rect.height(); } ElectricSvgGroup::ElectricSvgGroup(const ElectricSvgGroup& obj) : GraphicsProjectModelGroup(obj) { m_lastBoudingRect = obj.m_lastBoudingRect; m_boundingRect = obj.m_boundingRect; m_dWidth = obj.m_dWidth; m_dHeight = obj.m_dHeight; m_mapSvg = obj.m_mapSvg; } ElectricSvgGroup::~ElectricSvgGroup() { } ElectricSvgGroup* ElectricSvgGroup::clone() const { return new ElectricSvgGroup(*this); } QPainterPath ElectricSvgGroup::shape() { QPainterPath path; path.addRect(m_boundingRect); return path; } void ElectricSvgGroup::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 ElectricSvgGroup::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { 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 ElectricSvgGroup::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 ElectricSvgGroup::move(const QPointF& point) { moveBy(point.x(), point.y()); } void ElectricSvgGroup::updateMapSvg(QMap map) { m_mapSvg = map; } void ElectricSvgGroup::addSvgItem(ElectricSvgItem* item) { item->setParentItem(this); // 关键:设置父项 m_childItems.append(item); updateLayout(); } void ElectricSvgGroup::editShape(int nHandle,const QPointF& ptMouse) { prepareGeometryChange(); updateHandles(); }