修改缩放只能同侧调整的问题

This commit is contained in:
duanshengchao 2024-08-15 19:45:10 +08:00
parent e055e87107
commit 76c24a73be
8 changed files with 42 additions and 22 deletions

View File

@ -31,6 +31,7 @@ public:
private:
GraphicsItemType m_creatingType;
GraphicsBaseItem* m_pCreatingItem;
QPointF m_scalBasePoint;
};
#endif

View File

@ -23,6 +23,8 @@ public:
void mouseMoveEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
void mouseReleaseEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
private:
QPointF m_scalBasePoint;
};
#endif

View File

@ -23,7 +23,6 @@ GraphicsRectItem::GraphicsRectItem(const QRect &rect, bool isRound, QGraphicsIte
pHandle2->setType(T_editShape);
pHandle2->setTag(H_edit+1);
m_vecHanle.push_back(pHandle2);
}
}
@ -75,11 +74,11 @@ void GraphicsRectItem::updateCoordinate()
if (!parentItem())
{
prepareGeometryChange();
//创建时boundingRect原点不在中心刷新boundingRect并将变换原点设为中心点
m_boundingRect = QRectF(-m_dWidth / 2, -m_dHeight / 2, m_dWidth, m_dHeight);
setTransform(transform().translate(delta.x(), delta.y()));
setTransformOriginPoint(m_boundingRect.center());
//原点坐标变化后跟根据新坐标调整位置
moveBy(-delta.x(), -delta.y());
setTransform(transform().translate(-delta.x(), -delta.y()));
updateHandles();
}
@ -118,6 +117,8 @@ void GraphicsRectItem::resize(int nHandle,double dSX, double dSY, const QPointF&
case H_bottom:
dSX = 1; //拖拽的是顶点底点,为垂直缩放,忽略水平变化
break;
default:
break;
}
QTransform trans;

View File

@ -59,7 +59,8 @@ void CMainWindow::initializeDockUi()
// Set central widget
m_pDrawingPanel = new DrawingPanel();
connect(m_pDrawingPanel->getDesignerScene(), SIGNAL(signalAddItem(QGraphicsItem*)), this, SLOT(onSignal_addItem(QGraphicsItem*)));
DesignerScene* designerScene = m_pDrawingPanel->getDesignerScene();
connect(designerScene, SIGNAL((QGraphicsItem*)), this, SLOT(onSignal_addItem(QGraphicsItem*)));
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
CentralDockWidget->setWidget(m_pDrawingPanel);
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);

View File

@ -49,7 +49,8 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
else if(ms_nDragHandle > H_left) //编辑控制点上
{
m_opMode = OM_edit;
//setCursor(scene, Qt::ClosedHandCursor);
setCursor(scene, Qt::ClosedHandCursor);
emit setWorkingSelector(ST_editing);
}
else
{

View File

@ -8,6 +8,7 @@ CreatingSelector::CreatingSelector(QObject *parent)
{
m_type = ST_cerating;
m_pCreatingItem = nullptr;
m_scalBasePoint = QPointF();
}
CreatingSelector::~CreatingSelector()
{
@ -40,29 +41,32 @@ void CreatingSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, Designer
m_pCreatingItem->setSelected(true);
ms_nDragHandle = H_rightBottom;
setCursor(scene, Qt::CrossCursor);
}
void CreatingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
{
setCursor(scene, Qt::CrossCursor);
ms_ptMouseLast = event->scenePos();
if (m_pCreatingItem)
{
QPointF basePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle);
if(basePoint.x() == 0)
basePoint.setX(1);
if(basePoint.y() == 0)
basePoint.setY(1);
if(m_scalBasePoint.isNull()) //基准点不能采用临时变量因为handle的坐标也在不断变化计算会出现问题
{
m_scalBasePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle);
if(m_scalBasePoint.x() == 0)
m_scalBasePoint.setX(1);
if(m_scalBasePoint.y() == 0)
m_scalBasePoint.setY(1);
}
//计算缩放倍数
QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - basePoint;
QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - basePoint;
QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - m_scalBasePoint;
QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - m_scalBasePoint;
double sx = lastDelta.x() / iniDelta.x();
double sy = lastDelta.y() / iniDelta.y();
m_pCreatingItem->resize(ms_nDragHandle, sx, sy, basePoint);
m_pCreatingItem->resize(ms_nDragHandle, sx, sy, m_scalBasePoint);
}
}
@ -85,6 +89,7 @@ void CreatingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Design
ms_nDragHandle = H_none;
m_pCreatingItem = nullptr;
m_scalBasePoint = QPointF();
setCursor(scene, Qt::ArrowCursor);
emit setWorkingSelector(ST_base);
}

View File

@ -7,6 +7,7 @@ ScalingSelector::ScalingSelector(QObject *parent)
: BaseSelector(parent)
{
m_type = ST_scaling;
m_scalBasePoint = QPointF();
}
ScalingSelector::~ScalingSelector()
{
@ -29,19 +30,22 @@ void ScalingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerSc
{
if(ms_nDragHandle != H_none)
{
QPointF basePoint = item->getSymmetricPointPos(ms_nDragHandle);
if(basePoint.x() == 0)
basePoint.setX(1);
if(basePoint.y() == 0)
basePoint.setY(1);
if(m_scalBasePoint.isNull()) //基准点不能采用临时变量因为handle的坐标也在不断变化计算会出现问题
{
m_scalBasePoint = item->getSymmetricPointPos(ms_nDragHandle);
if(m_scalBasePoint.x() == 0)
m_scalBasePoint.setX(1);
if(m_scalBasePoint.y() == 0)
m_scalBasePoint.setY(1);
}
//计算缩放倍数
QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - basePoint;
QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - basePoint;
QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - m_scalBasePoint;
QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - m_scalBasePoint;
double sx = lastDelta.x() / iniDelta.x();
double sy = lastDelta.y() / iniDelta.y();
item->resize(ms_nDragHandle, sx, sy, basePoint);
item->resize(ms_nDragHandle, sx, sy, m_scalBasePoint);
}
}
}
@ -60,6 +64,7 @@ void ScalingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Designe
}
ms_nDragHandle = H_none;
m_scalBasePoint = QPointF();
setCursor(scene, Qt::ArrowCursor);
emit setWorkingSelector(ST_base);
}

View File

@ -2,6 +2,7 @@
#include "util/creatingSelector.h"
#include "util/movingSelector.h"
#include "util/scalingSelector.h"
#include "util/EditingSelector.h"
SelectorManager* SelectorManager::m_pInstance = nullptr;
@ -23,6 +24,9 @@ SelectorManager::SelectorManager(QObject *parent)
ScalingSelector* scalingSelector = new ScalingSelector(this);
connect(scalingSelector, SIGNAL(setWorkingSelector(SelectorType)), this, SLOT(onSignal_setWorkingSelector(SelectorType)));
m_vecSelectors.push_back(scalingSelector);
EditingSelector* editingSelector = new EditingSelector(this);
connect(editingSelector, SIGNAL(setWorkingSelector(SelectorType)), this, SLOT(onSignal_setWorkingSelector(SelectorType)));
m_vecSelectors.push_back(editingSelector);
m_curSelector = ST_base;
}