9

私のプログラムは、私QLineEditの内の複数ので構成されていQMainWindowます。ユーザーは、任意ののテキストを変更できますQLineEdit。現在、それぞれが選択されている場合、それぞれのデフォルトの実装で元に戻る-やり直しを実行できます。ただし、元に戻る*やり直し*ボタンが押されたときに、それに応じて編集者が元になり/やり直しを実行するように機能を追加したいと思います。つまり、L1、L2などが私のものだと言います。次に、ユーザーは次の操作を実行します。1.L2->テキストを追加...5。L5->テキストを追加...9。L3->テキストを削除10.L5->元に戻す(L5を選択してから「 ctrl + z ")QLineEditQLineEditQLineEditQLineEdit

ここで、ユーザーが次のように[元に戻す/やり直し]ボタンを押すと、次のようになります。 94.元に戻す->手順8で行った操作を元に戻す必要があります

現在、私は歴史を主流化するメカニズムを漠然と考えることができますが、それはかなり退屈でしょう。それで、Qtがこれを行うための組み込み機能を提供しているかどうか知りたいですか?ありがとうございました。

4

3 に答える 3

16

QtはUndo/Redoフレームワークを提供します。

QUndoCommand基本的に、取り消し可能/やり直し可能にしたいアクションごとに、から派生したコマンドを実装してから、それらをにプッシュしますQUndoStack。後で、の対応するスロットを呼び出すことにより、コマンドを元に戻したり、やり直したりできますQUndoStack

コマンドをスタックにプッシュすると、コマンドは自動的に再実行されることに注意してください。これは初めて実行されることを意味します。コマンドが実際にすでに実行されている可能性があるため、これが希望どおりでない場合があります。コマンドの実装では、これを考慮する必要があります。

于 2013-02-21T09:46:13.430 に答える
3

これを実装する1つの方法は、「コマンド」パターンを使用することです。Qtは、次のパターンに従うundoフレームワークを提供します:http: //qt-project.org/doc/qt-4.8/tools-undoframework.html

これを容易にするために、プログラムをもう少しMVC(model-view-controller)にするために、プログラムにいくつかの変更を加える必要がある場合があります。フォームの内容を表すデータモデルがあります。フォーム自体はビューとコントローラーです。ユーザーが行の編集を変更すると、データモデルが更新されます。データモデルは、QtundoフレームワークからQUndoStackにプッシュされるQUndoCommandsを使用してモデルへの変更を実装します。モデルの状態が変更されると(元に戻す/やり直しのため)、UIは変更に応答し、モデルの状態を反映するように更新されます。

于 2013-02-21T09:49:19.737 に答える
1

Qtには、元に戻すのに役立つクラスがあります。を参照してくださいQUndoStack。元に戻すことができる各ステップは、のサブクラスとして実装する必要がありQUndoCommandます。

の内部UNDOスタックをバイパスする必要があるため、達成しようとしていることは簡単ではありませんQLineEditfocusChangedここに1つの提案があります:からの信号を聞いてくださいQApplication。ラインエディットの1つにフォーカスストアがある場合は、そのコンテンツを保存してQLineEdit::editingFinished()シグナルに接続します。これを受け取ったら、古いテキストと新しいテキストを使用してスタックにコマンドを配置します。このアプローチの欠点は、単一ので中間編集をキャプチャしないことですQLineEdit。たとえば、1)ユーザーがテキストを選択して削除を押してから、2)新しいテキストを入力する場合、個別の元に戻すことができる手順として、キーイベントのフィルタリングを開始する必要があり、ロジックが非常に複雑になる可能性があります。しかし、それが一般的なアプローチです。

于 2013-02-21T09:52:32.537 に答える