DiagramDesigner/diagramCavas/source/graphicsItem/electricSvgGroupPT.cpp

156 lines
4.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
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<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();
}