#include "graphicsItem/electricSvgGroupPT.h" #include "graphicsItem/electricSvgItemPT.h" #include "global.h" #include #include #include #include ElectricSvgGroupPT::ElectricSvgGroupPT(const QRect &rect, QGraphicsItem *parent) : ElectricSvgGroup(rect,parent) { setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); setFunctionHandleEnaable(false); } ElectricSvgGroupPT::ElectricSvgGroupPT(const ElectricSvgGroupPT& obj) : ElectricSvgGroup(obj) { setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); setFunctionHandleEnaable(false); m_lstType = obj.m_lstType; } ElectricSvgGroupPT::~ElectricSvgGroupPT() { } ElectricSvgGroupPT* ElectricSvgGroupPT::clone() const { return new ElectricSvgGroupPT(*this); } void ElectricSvgGroupPT::setupFinish(QVariant var) { if(var.canConvert>()){ QList lst = var.value>(); m_lstType = lst; } updateItem(); } void ElectricSvgGroupPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { ElectricSvgGroup::paint(painter,option,widget); if(m_childItems.isEmpty()){ //无对象时绘制提示框 QPen pen(Qt::lightGray); pen.setStyle(Qt::DotLine); painter->setPen(pen); painter->drawRect(m_boundingRect); } } void ElectricSvgGroupPT::updateItem() { for(auto pItem:m_childItems){ delete pItem; } m_childItems.clear(); QRect rec(0,0,30,30); for(int i = 0;i < m_lstType.size();++i){ ElectricSvgItemPT* p = new ElectricSvgItemPT(rec); if(m_lstType[i] == 1){ p->loadSvg(m_mapSvg["y"]); p->setItemType(1); } else{ p->loadSvg(m_mapSvg["z"]); p->setItemType(0); } p->setMoveable(false); addSvgItem(p); } updateTerPos(); } void ElectricSvgGroupPT::updateLayout() { if (m_childItems.isEmpty()) return; // 获取所有子项 //QList children = childItems(); int n = m_childItems.size(); if (n == 0) return; // 中心点 QPointF center(0, 0); // 假设以当前item的坐标系中心为布局中心 // 圆的半径(假设所有子项大小相同) qreal radius = m_childItems.first()->boundingRect().width()*0.5; // 根据需要调整 // 布局半径(子项中心到布局中心的距离) qreal layoutRadius = radius * 1; // 根据需要调整 switch(n) { case 1: // 单个子项放在中心 m_childItems[0]->setPos(center); break; case 2: // 两个子项上下排列 m_childItems[0]->setPos(center.x(), center.y() - layoutRadius); m_childItems[1]->setPos(center.x(), center.y() + layoutRadius); break; case 3: // 三个子项三角形排列 for (int i = 0; i < 3; ++i) { qreal angle = 2 * M_PI * i / 3 - M_PI / 2; // 从顶部开始 m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), center.y() + layoutRadius * sin(angle)); } break; case 4: // 四个子项正方形排列 for (int i = 0; i < 4; ++i) { qreal angle = 2 * M_PI * i / 4 - M_PI / 4; // 从右上角开始 m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), center.y() + layoutRadius * sin(angle)); } break; case 5: // 五个子项五角星排列 for (int i = 0; i < 5; ++i) { qreal angle = 2 * M_PI * i / 5 - M_PI / 2; // 从顶部开始 m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), center.y() + layoutRadius * sin(angle)); } break; default: // 对于多于5个的情况,使用圆形排列 for (int i = 0; i < n; ++i) { qreal angle = 2 * M_PI * i / n; m_childItems[i]->setPos(center.x() + layoutRadius * cos(angle), center.y() + layoutRadius * sin(angle)); } break; } updateBoundRect(); }