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

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: private:
GraphicsItemType m_creatingType; GraphicsItemType m_creatingType;
GraphicsBaseItem* m_pCreatingItem; GraphicsBaseItem* m_pCreatingItem;
QPointF m_scalBasePoint;
}; };
#endif #endif

View File

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

View File

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

View File

@ -59,7 +59,8 @@ void CMainWindow::initializeDockUi()
// Set central widget // Set central widget
m_pDrawingPanel = new DrawingPanel(); 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"); CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
CentralDockWidget->setWidget(m_pDrawingPanel); CentralDockWidget->setWidget(m_pDrawingPanel);
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget); auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);

View File

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

View File

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

View File

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

View File

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