Qt::QUndoCommand の問題と可能な解決策。
Qt で 3D 編集のアプリケーションを開発しています。
ユーザーが自分の操作に対して元に戻す/やり直すことができるようにする「操作のスタック」を実装する必要があります。
QUndoCommand Qt クラスで QUndoStack を使用しています。
アプリケーションは MVC パターンに基づいているため、ビュー (QGLWidget) はシーン構造を描画する方法を認識しています。
3D オブジェクト (メッシュ) を移動/回転/スケーリングするためのスライダー (QSlider) があり、変換の効果をリアルタイムで表示する必要があります。
たとえば、オブジェクトを選択して「X Translation Slider」を動かしている場合、スライダーをドラッグしている間、オブジェクトが X 軸に沿って移動するのを見たいと思います。問題は、操作のスタックでリアルタイム編集を機能させることです。実際、スタックにプッシュする必要がある「元に戻す」操作は、スライダーの全移動 (スライダーを押してから離すまで) です。
これを行うには、次の 2 つの方法があります。
スライダーを (すべての valueChanged シグナルで) ドラッグしている間、変換がモデルに適用され、QGLWidget はすべてのスライダー ティックの直後に更新されます。スライダーを放した時点で、コマンドをスタックにプッシュする必要があります。コマンドがプッシュされると、QUndoStack は自動的に QUndoCommand::redo() アクションを呼び出します。QUndoStack::push() の呼び出しの前に操作が 2 回実行されるのを防ぐために (1 回目はリアルタイム効果を付与するため、2 回目は QUndoStack::push() 呼び出しで)、逆変換がオブジェクト (スライダーの合計移動から取得) を取得し、コマンドをスタックにプッシュします。
QUndoStack は、QUndoCommand::Id() の呼び出しの結果が同じ場合、コマンドをマージしようとします。スライダーをドラッグしている間 (valueChanged シグナルごとに) QUndoCommand が生成され、すぐにスタックにプッシュされます。同じ Id() がある場合、スタックはそれを上部のコマンドとマージし、スタックは redo( を呼び出します。 ) 挿入されているコマンドの場合、QGLWidget が更新され、リアルタイムの効果が得られます。
2 番目のものでは、"Command" クラスのインスタンスがスライダー ティックごとに生成されますが、最初のものでは、コマンドをプッシュして一貫した状態を維持するためだけにリアルタイム操作が元に戻されます。
「優れたプログラミング」に関してはどのソリューションが優れていますか?パフォーマンスに関してはどのソリューションが優れていますか?