2013-01-31 2 views
5

이동 가능한 모양이있는 QGraphicsScene 캔버스를 기반으로하는 Qt 앱을 작성 중이며 실행 취소 다시 실행 기능을 통합하려고합니다. 모양의 생성 및 삭제와 같은 대부분의 기능은 QGraphicsScene 자체에서 구현하는 것이 상당히 쉽지만 요소를 이동 가능하게하고 이동을 실행 취소 할 수 있기를 원합니다. 지금은 장면에 고무 밴드 드래그 모드를 사용하고 항목에 ItemIsSelectableItemIsMovable 플래그를 사용하고 있습니다. 문제는 형상 이동을 나타 내기 위해 QUndoCommand을 생성 할 좋은 곳이없는 것 같습니다. QGraphicsScene::itemChange 방법으로 수행하면 둘 이상의 셰이프를 선택하고 이동하면 다른 개체가 인터리브되므로 별도의 실행 취소 명령이 생기므로 병합 할 수 없으므로 실행 취소하면 예기치 않은 동작이 발생합니다. QGraphicsScene에는 항목이 이동 될 때 호출되는 이벤트가 없으므로 방해가됩니다. 내가 볼Qt : QGraphicsScene을 사용하여 실행 취소 프레임 워크를 올바르게 통합합니다.

최악의 시나리오는 내가 내 사용자 지정 QGraphicsItem 개체에 ItemIsMovable 플래그를 해제하고 QGraphicsScene 마우스 이벤트에 완전히 움직임을 처리하지만, 그 기능을 재 구현하는 것은 적절 아주 복잡한 것이다 (나는 Qt는 그것을 내부적으로 수행하는 방법을 확인하고 객체와 그 자식 중 둘 모두가 선택되는 것과 같은 복잡한 경우를 처리하기위한 코드가 상당히 많습니다. 이것은 실행 취소 스택의 사용 사례 중에서 가장 명백한 것 같습니다 (실행 취소 프레임 워크의 예제 프로그램은 다중 오브젝트 이동 지원이없는 경우를 제외하고는 광산처럼 QGraphicsScene 프로그램입니다). 그래서 기본 제공되지 않습니다. 핵심 기능의 상당 부분을 다시 구현하지 않고도이를 수행 할 수 있습니다. 누구든지이 일을하는 통찰력이나 프로그램의 예가 있습니까?

답변

4

나는 다소 hackishly 이것을 해결했다. 내가, 내가, 각각의 현재의 위치로 선택한 모양의 각각의 preMovePoint 설정 내 사용자 정의 모양을하고 QGraphicsScenemousePressedEventpreMovePoint 속성을 추가 mouseReleaseEvent에서의 현재 pospreMovePoint에서 복합 이동 명령을 생성 각 모양. 나는 여전히 더 좋은 방법이 있는지 알고 싶어합니다.

+0

각각의'QGraphicsItem'에서 이전 위치 스택을 포함하는 유사한 해킹 수정을 찾은 다음 변경된 항목을 실행 취소 스택으로 푸시합니다. 못생긴지만 작동합니다. 질문과 답변에 감사드립니다. –