私は通常、.net フレームワークに慣れており、最近、C++/Qt を使用するプロジェクトに取り組む機会を得ました。このコンテキストでは、次の機能を実装したいと考えています: (簡単にするために、ListView と Textbox/Textedit があるとします)
- ListView の項目を選択すると、対応するテキストが textedit に表示されます(完了)
- テキストを編集してリスト内の別の項目をクリックすると、変更を保存するかキャンセルするかを尋ねるダイアログが表示されます(完了)。textedit は、選択されたアイテムが変更されたことを知らせるシグナルをリストから受け取ります。
- ユーザーが保存 -> 保存してリスト内の項目を更新すると、ユーザーがクリックした新しい項目がリスト内で選択されます(完了) 。
- ユーザーがキャンセルを押した場合->ユーザーがクリックした他の項目を選択しないでください(これが私の問題です)
基本的に、これには2つの解決策があります(もっとあるかもしれません):
- textedit からリストに信号を送り返し、リストに前の選択を復元するように指示します。個人的には、このソリューションはあまり好きではありません。なぜなら、それらをより強く結合する必要があるからです (リストはテキスト編集にシグナルを送信し、現在はその逆も行っています)。また、この「強制的な」選択の復元は、再びブロックする必要がある後続の信号を再びトリガーする可能性があります...
- はるかに優れた解決策 (私が思うに) は、信号に拒否メカニズムを持たせることです。リストが 2 つのシグナルを送信すると想像できます。
- 最初のものを呼び出しましょう
aboutToChangeSelection(proposedSelection, vetoObj)
- アクションが完了した後の別のもの:
changedSelection(newSelection)
- 最初のものを呼び出しましょう
最初のシグナルは textedit に送信され、最終的に拒否権が利用されます。この後、同じシグナルがリスト自体に送信され、拒否に応じてアクションが実行され、実際に選択が変更された場合は 2 番目のシグナルが送信されます。
.NET の世界では、.NET の助けを借りて、このようなメカニズムが存在しますCancelEventArgs
。.NET イベントと Qt シグナルの動作原理がまったく異なることは知っていますが、同じ効果を達成するのに相当する Qt はありますか?
助けてくれてありがとう!