2013-01-31 42 views
5

我正在編寫一個基於QGraphicsScene畫布的Qt應用程序,其上有可移動的形狀,我正在嘗試集成撤銷 - 重做功能。對於像創建和刪除形狀的大多數功能來說,在QGraphicsScene本身上實現起來相當簡單,但我希望元素可以移動並且可以撤消移動。現在,我正在使用場景上的橡皮筋拖拽模式以及項目上的ItemIsSelectableItemIsMovable標誌。問題是,似乎沒有好的地方來創建代表形狀運動的QUndoCommand。如果我在QGraphicsScene::itemChange方法中執行此操作,那麼選擇並移動兩個或更多形狀會導致針對不同對象進行單獨的撤消命令,這些命令將被交織,因此無法合併,因此撤消會導致意外行爲。 QGraphicsScene中沒有任何事件會在我看到它的項目移動時被調用,所以我有點卡住了。Qt:正確地將撤消框架與QGraphicsScene集成

最壞的情況,我看到的是,我禁用ItemIsMovable標誌上我的自定義QGraphicsItem對象,並完全在QGraphicsScene鼠標事件處理動作,但重新實現該功能正常,似乎相當複雜(我查了Qt的是如何做的內部和處理複雜情況的代碼有很多,比如選擇一個對象及其一些子對象的地方)。這似乎是撤銷堆棧中最明顯的用例(除非沒有多個對象移動支持,否則撤銷框架的示例程序與我的程序非常相似,因此看起來很奇怪,因爲沒有內置在不重新實現核心功能的重要部分的情況下做到這一點。有沒有人有任何見解或這樣做的程序的例子?

回答

4

我解決這個有點hackishly我認爲。我添加了一個preMovePoint屬性到我的自定義形狀和在QGraphicsScenemousePressedEvent,我設置每個所選的形狀,以它們各自的當前位置的的preMovePoint,和在mouseReleaseEvent,創建從preMovePoint的複合移動命令到的當前pos每個形狀。我仍然有興趣知道是否有更好的方法。

+0

我想出了一個類似的黑客修復方法,它涉及每個「QGraphicsItem」中以前的位置堆棧,然後將更改爲撤消堆棧的項目推送。這是醜陋的,但它的工作。感謝您的問題和答案。 –