2025-10-17 18:14:44 +08:00
|
|
|
|
#include "graphicsItem/electricSvgGroupPT.h"
|
|
|
|
|
|
#include "graphicsItem/electricSvgItemPT.h"
|
|
|
|
|
|
#include "global.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
|
#include <QStyleOption>
|
|
|
|
|
|
#include <QGraphicsScene>
|
|
|
|
|
|
#include <QGraphicsView>
|
|
|
|
|
|
|
|
|
|
|
|
ElectricSvgGroupPT::ElectricSvgGroupPT(const QRect &rect, QGraphicsItem *parent)
|
|
|
|
|
|
: ElectricSvgGroup(rect,parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
setHandleIfShow(H_textCaption,false);
|
|
|
|
|
|
setHandleVisible(false);
|
|
|
|
|
|
setFunctionHandleIfShow(false);
|
|
|
|
|
|
setFunctionHandleEnaable(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-14 19:31:09 +08:00
|
|
|
|
ElectricSvgGroupPT::ElectricSvgGroupPT(const ElectricSvgGroupPT& obj)
|
|
|
|
|
|
: ElectricSvgGroup(obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
setHandleIfShow(H_textCaption,false);
|
|
|
|
|
|
setHandleVisible(false);
|
|
|
|
|
|
setFunctionHandleIfShow(false);
|
|
|
|
|
|
setFunctionHandleEnaable(false);
|
|
|
|
|
|
m_lstType = obj.m_lstType;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-17 18:14:44 +08:00
|
|
|
|
ElectricSvgGroupPT::~ElectricSvgGroupPT()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-14 19:31:09 +08:00
|
|
|
|
ElectricSvgGroupPT* ElectricSvgGroupPT::clone() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return new ElectricSvgGroupPT(*this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-17 18:14:44 +08:00
|
|
|
|
void ElectricSvgGroupPT::setupFinish(QVariant var)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(var.canConvert<QList<int>>()){
|
|
|
|
|
|
QList<int> lst = var.value<QList<int>>();
|
|
|
|
|
|
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<QGraphicsItem*> 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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|