DiagramDesigner/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp

98 lines
2.5 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/functionModelItem/graphicsFunctionModelItem.h"
GraphicsFunctionModelItem::GraphicsFunctionModelItem(QGraphicsItem *parent)
: GraphicsProjectModelItem(parent)
{
}
GraphicsProjectModelItem::~GraphicsProjectModelItem()
{
}
void GraphicsProjectModelItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
}
/********************************功能模item组*************************************/
GraphicsFunctionModelGroup::GraphicsFunctionModelGroup(QGraphicsItem *parent)
:GraphicsFunctionModelItem(parent)
{
}
GraphicsFunctionModelGroup::~GraphicsFunctionModelGroup()
{
}
void GraphicsFunctionModelGroup::addItem(GraphicsFunctionModelItem* item)
{
item->setParentItem(this); // 关键:设置父项
m_childItems.append(item);
updateLayout();
}
QRectF GraphicsFunctionModelGroup::updateBoundRect()
{
QRectF rect;
if(m_childItems.size()){
for (auto* child : m_childItems) {
rect |= child->boundingRect().translated(child->pos());
}
m_boundingRect = rect;
}
else
{
return m_boundingRect;
}
updateHandles();
return rect;
}
void GraphicsFunctionModelGroup::updateLayout()
{
if (m_childItems.isEmpty()) return;
// 计算所有子项的总尺寸
qreal totalSize = 0;
QList<qreal> childSizes;
for (GraphicsBaseItem *child : m_childItems) {
QRectF childRect = child->boundingRect();
qreal size = (m_direction == 0) ? childRect.width() : childRect.height();
childSizes.append(size);
totalSize += size;
}
// 计算总间距
qreal totalSpacing = m_spacing * (m_childItems.size() - 1);
// 计算起始位置(相对于父项中心)
qreal startPos = -(totalSize + totalSpacing) / 2;
// 定位每个子项
qreal currentPos = startPos;
for (int i = 0; i < m_childItems.size(); ++i) {
GraphicsBaseItem *child = m_childItems[i];
QRectF childRect = child->boundingRect();
if (m_direction == 0) {
// 水平布局x坐标变化y坐标保持中心对齐
child->setPos(currentPos, -childRect.height() / 2);
currentPos += childSizes[i] + m_spacing;
} else {
// 垂直布局y坐标变化x坐标保持中心对齐
child->setPos(-childRect.width() / 2, currentPos);
currentPos += childSizes[i] + m_spacing;
}
}
updateBoundRect();
}