151 lines
4.0 KiB
C++
151 lines
4.0 KiB
C++
#include "graphicsItem/graphicsBaseItem.h"
|
||
|
||
GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent)
|
||
:QGraphicsItem(parent)
|
||
{
|
||
//初始化缩放操作用的handle
|
||
m_vecHanle.reserve(H_left);
|
||
for(int i = H_leftTop; i <= H_left; i++)
|
||
{
|
||
ItemControlHandle* pHandle = new ItemControlHandle(this);
|
||
pHandle->setType(T_resize);
|
||
pHandle->setTag(i);
|
||
m_vecHanle.push_back(pHandle);
|
||
}
|
||
|
||
setFlag(QGraphicsItem::ItemIsMovable, true);
|
||
setFlag(QGraphicsItem::ItemIsSelectable, true);
|
||
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
|
||
setAcceptHoverEvents(true);
|
||
}
|
||
|
||
GraphicsBaseItem::~GraphicsBaseItem()
|
||
{
|
||
for (size_t i = 0; i < m_vecHanle.size(); i++)
|
||
{
|
||
ItemControlHandle* pHandle = m_vecHanle[i];
|
||
if (pHandle)
|
||
{
|
||
delete pHandle;
|
||
pHandle = nullptr;
|
||
}
|
||
}
|
||
}
|
||
|
||
void GraphicsBaseItem::setWidth(double width)
|
||
{
|
||
m_dWidth = width;
|
||
updateCoordinate();
|
||
}
|
||
|
||
void GraphicsBaseItem::setHeight(double height)
|
||
{
|
||
m_dHeight = height;
|
||
updateCoordinate();
|
||
}
|
||
|
||
QVariant GraphicsBaseItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value)
|
||
{
|
||
if (change == QGraphicsItem::ItemSelectedHasChanged)
|
||
{
|
||
QGraphicsItemGroup *group = dynamic_cast<QGraphicsItemGroup *>(parentItem());
|
||
if(!group)
|
||
setHandleVisible(value.toBool());
|
||
else //在某一组群中,由组群展示是否选中,自身不做展示
|
||
{
|
||
setSelected(false);
|
||
return QVariant::fromValue<bool>(false);
|
||
}
|
||
}
|
||
return QGraphicsItem::itemChange(change, value);
|
||
}
|
||
|
||
void GraphicsBaseItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
|
||
{
|
||
Q_UNUSED(event);
|
||
}
|
||
|
||
void GraphicsBaseItem::setHandleVisible(bool visible)
|
||
{
|
||
for(auto it = m_vecHanle.begin(); it != m_vecHanle.end(); it++)
|
||
{
|
||
if(visible)
|
||
(*it)->show();
|
||
else
|
||
(*it)->hide();
|
||
}
|
||
}
|
||
|
||
QPointF GraphicsBaseItem::getSymmetricPointPos(int nHandle)
|
||
{
|
||
QPointF pt;
|
||
//编号从1开始,因此下标需要-1
|
||
switch (nHandle)
|
||
{
|
||
case H_leftTop:
|
||
pt = m_vecHanle.at(H_rightBottom - 1)->pos();
|
||
break;
|
||
case H_top:
|
||
pt = m_vecHanle.at(H_bottom - 1)->pos();
|
||
break;
|
||
case H_rightTop:
|
||
pt = m_vecHanle.at(H_leftBottom - 1)->pos();
|
||
break;
|
||
case H_right:
|
||
pt = m_vecHanle.at(H_left - 1)->pos();
|
||
break;
|
||
case H_rightBottom:
|
||
pt = m_vecHanle.at(H_leftTop - 1)->pos();
|
||
break;
|
||
case H_bottom:
|
||
pt = m_vecHanle.at(H_top - 1)->pos();
|
||
break;
|
||
case H_leftBottom:
|
||
pt = m_vecHanle.at(H_rightTop - 1)->pos();
|
||
break;
|
||
case H_left:
|
||
pt = m_vecHanle.at(H_right - 1)->pos();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return pt;
|
||
}
|
||
|
||
void GraphicsBaseItem::updateHandles()
|
||
{
|
||
const QRectF& boundRect = this->boundingRect();
|
||
for(auto it = m_vecHanle.begin(); it != m_vecHanle.end(); it++)
|
||
{
|
||
switch ((*it)->getTag()) {
|
||
case H_leftTop:
|
||
(*it)->move(boundRect.x(), boundRect.y());
|
||
break;
|
||
case H_top:
|
||
(*it)->move(boundRect.x() + boundRect.width() * 0.5, boundRect.y());
|
||
break;
|
||
case H_rightTop:
|
||
(*it)->move(boundRect.x() + boundRect.width(), boundRect.y());
|
||
break;
|
||
case H_right:
|
||
(*it)->move(boundRect.x() + boundRect.width(), boundRect.y() + boundRect.height() * 0.5);
|
||
break;
|
||
case H_rightBottom:
|
||
(*it)->move(boundRect.x() + boundRect.width(), boundRect.y() + boundRect.height());
|
||
break;
|
||
case H_bottom:
|
||
(*it)->move(boundRect.x() + boundRect.width() * 0.5, boundRect.y() + boundRect.height());
|
||
break;
|
||
case H_leftBottom:
|
||
(*it)->move(boundRect.x(), boundRect.y() + boundRect.height());
|
||
break;
|
||
case H_left:
|
||
(*it)->move(boundRect.x(), boundRect.y() + boundRect.height() * 0.5);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|