6

可動形状のキャンバスをベースにしたQtアプリを作成してQGraphicsSceneいて、元に戻る機能を統合しようとしています。形状の作成や削除などのほとんどの機能では、QGraphicsSceneそれ自体に実装するのはかなり簡単ですが、要素を移動可能にし、移動を元に戻せるようにする必要があります。現在、シーンでラバーバンドドラッグモードを使用し、アイテムItemIsSelectableItemIsMovableフラグを使用しています。QUndoCommand問題は、形状の動きを表すためにを作成するのに適した場所がないように見えることです。メソッド内でこれを行うと、QGraphicsScene::itemChange2つ以上の図形を選択して移動すると、異なるオブジェクトに対して別々の元に戻すコマンドがインターリーブされ、マージできなくなるため、元に戻すと予期しない動作が発生します。にイベントはありませんQGraphicsSceneそれは私が見ることができるようにそのアイテムが動き回るときに呼ばれるので、私はちょっと立ち往生しています。

私が見た最悪のシナリオはItemIsMovable、カスタムQGraphicsItemオブジェクトのフラグを無効にし、QGraphicsSceneマウスイベントで移動を完全に処理することですが、その機能を適切に再実装することは非常に複雑に見えます(Qtが内部でどのように行うかを確認し、コードが非常に多いオブジェクトとその子の一部が両方とも選択されている場合など、複雑なケースを処理する場合)。これは、undoスタックの最も明白なユースケースのようです(undoフレームワークのサンプルプログラムは、QGraphicsScene複数のオブジェクトの移動がサポートされていないことを除いて、私のようなプログラムです)。したがって、組み込みの方法がないのは奇妙に思えます。コア機能の重要な部分を再実装せずにそれを行うため。誰かがこれを行うプログラムの洞察や例を持っていますか?

4

1 に答える 1

6

私はこれをややハック的に解決したと思います。preMovePointカスタムシェイプにプロパティを追加し、mousePressedEventので、選択した各シェイプのをそれぞれの現在の位置にQGraphicsScene設定し、で、から各シェイプの現在への複合移動コマンドを作成しました。もっと良い方法があるかどうか知りたいと思います。preMovePointmouseReleaseEventpreMovePointpos

于 2013-01-31T20:14:46.750 に答える