2014-10-15 9 views
-1

내 그래픽 장면에서 QGraphicsItemGroup으로 이동 작업을 실행 취소/다시 실행하는 중입니다. 그것은 포인트 엔티티에 적합합니다.Qt 항목 이동을위한 실행 취소/다시 실행

이동에 대한 나의 명령은 다음과 같습니다

내 명령으로 실행 취소 스택에 밀어
class CommandMove : public QUndoCommand 
{ 
public: 
    CommandMove(QGraphicsItemGroup *group, qreal fromX, qreal fromY, 
       qreal toX, qreal toY) 
    { 
     itemGroup = group; 
     mFrom = QPointF(fromX, fromY); 
     mTo = QPointF(toX, toY); 
     setText(QString("Point move (%1,%2) -> (%3,%4)").arg(fromX).arg(fromY) 
       .arg(toX).arg(toY)); 
    } 

    virtual void undo() 
    { 
     itemGroup->setPos(mFrom); 
    } 

    virtual void redo() 
    { 
     itemGroup->setPos(mTo); 
    } 

private: 
    QGraphicsItemGroup *itemGroup; 
    QPointF mFrom; 
    QPointF mTo; 
}; 

:

typedef QPair<QGraphicsItemGroup *, QPointF> item; 

Implemenatation :

if (item.first->scenePos() != item.second) 
    { 
     mUndoStack->push(new CommandMove(item.first, item.second.x(), 
              item.second.y(), item.first->x(), 
              item.first->y())); 
    } 

itemQPair과 같이 정의입니다 선, 원 등과 같은 엔티티의 경우 포인트. 예 : 라인의 시작점과 끝점. 엔티티 이동 명령을 어떻게 정의합니까?

편집

이 라인에 대한 내 구현 : 여기에 event

if (m1) 
    { 
    start_p = event->scenePos(); 
    m1 = false; 
    m2 = true; 
    } 
else if (!m1 && m2) 
    { 
    end_p = event->scenePos(); 
    m3 = true; 
    m2 = false; 
    } 
if (m3) 
    { 
    lineItem = new Line(start_p, end_p); 
    } 

mousePressEvent입니다.

어디에서 setPos을 사용하여 선의 위치를 ​​설정합니까?

+0

아니요, 더 이상 정보가 필요하지 않습니다. 항목의 위치를 ​​설정하면 원래 위치가 새 항목으로 변환됩니다. (전체 항목이 번역되었습니다) – mhcuervo

+0

나는 이것을 위해했다. 나는 라인에 대한 구현을하고 싶다. 한 줄의 끝점을 제공하면 충분합니까? –

+0

'mFrom' 포인트를 아이템의'pos()'로하고, 그 위치를'mTo'로 설정하십시오. 그것은 그래픽 항목을위한 구현 일 것입니다. – mhcuervo

답변

1

나는 모든 항목의 특성에 신경 쓰지 않아야한다고 생각합니다. 모든 항목 또는 항목 그룹에 대해 잘 작동하는 이동 명령을 구현할 수 있습니다. 이 코드는 수정 된 버전입니다.

class CommandMove : public QUndoCommand 
{ 
public: 
    CommandMove(QGraphicsItem *item, qreal toX, qreal toY) 
    { 
     mItem = item; 
     mFrom = mItem->pos(); 
     mTo = QPointF(toX, toY); 
     setText(QString("Point move (%1,%2) -> (%3,%4)").arg(mFrom.x()).arg(mFrom.y()) 
       .arg(mTo.x()).arg(mTo,y())); 
    } 

    virtual void undo() 
    { 
     mItem->setPos(mFrom); 
    } 

    virtual void redo() 
    { 
     mItem->setPos(mTo); 
    } 

private: 
    QGraphicsItem* mItem; 
    QPointF mFrom; 
    QPointF mTo; 
}; 

이 정보가 도움이되기를 바랍니다.

+0

그래서 시작점의 좌표를 전달하면 종점의 좌표가 자동으로 업데이트됩니까? –

+0

정확하지 않습니다. 제 말은 라인의 시작점이 될 필요는 없지만 ('pos'로 얻은) 위치를 전달하면 시작과 끝 지점이 자동으로 업데이트된다는 것입니다. 이것은 모든 종류의 항목에서 발생합니다. – mhcuervo

+0

다시 실행 취소를 실행하면 알 수 있지만 파일을 이동 한 후 업데이트 된 좌표를 저장하려고합니다. 이것은'pos()'를 사용하여 올바르게 수행되지 않습니다. –