修改缩放只能同侧调整的问题
This commit is contained in:
parent
e055e87107
commit
76c24a73be
|
|
@ -31,6 +31,7 @@ public:
|
|||
private:
|
||||
GraphicsItemType m_creatingType;
|
||||
GraphicsBaseItem* m_pCreatingItem;
|
||||
QPointF m_scalBasePoint;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ public:
|
|||
void mouseMoveEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
|
||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent*, DesignerScene*);
|
||||
|
||||
private:
|
||||
QPointF m_scalBasePoint;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue