5

私は通常、.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 はありますか?

助けてくれてありがとう!

4

2 に答える 2

1

QListWidgetの代わりにを使用している場合QListViewは、次のように実行できます。

  • シグナルを聞く:QListWidget::itemPressed ( QListWidgetItem * item )アイテムが変更されたことを示すシグナルではなく(つまりcurrentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )、私の例では)
  • ダイアログを開く機能は、この信号に接続されたスロットです。修正する必要はないと思います。
  • 信号を聞いてください:currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )現在と最後のアイテムを覚えるためにのみ使用されます。
  • あなたの場合、ユーザーがキャンセルを設定すると、プログラムで最後の項目に戻ります。

ここで1つの問題があります。どの信号が最初に受信されますか?ドキュメントでは指定されておらず、任意の順序にすることができます。ユーザーがアイテムを使用していて、アイテムAをクリックした場合B、lastitemをA、現在のアイテムをB処理している時点で表示する必要がありますitemPressed。したがって、currentItemChanged最初に処理する必要があります。幸いなことに、あなたはQt::DirectConnectionのためcurrentItemChangedに使用Qt::QueuedConnectionすることができますitemPressed

別:

リストウィジェットでイベントフィルターを使用できます。このフィルターは、いくつかの手順で説明した処理を実行するためのフィルターになります。ユーザーが[同意する]をクリックすると、イベントがリストビューに送信されます。ユーザーが拒否した場合は、イベントをブロックします。よくわかりませんが、イベントがフィルターで処理されないため、この代替手段が実行不可能になる可能性があります。

于 2012-10-26T12:40:46.853 に答える
0

これについて 100% 確信があるわけではありませんが、オーバーライドQCoreApplication::notify( QObject * receiver, QEvent * event )して適切なイベントを見つけて、それを呼び出すことができますignore()。そして、いつ無視するかを伝えるために、新しいサブクラスを追加し、QEventそこにターゲット要素ポインターを埋め込み、拒否イベントとして機能させることができます-それが受信された場合、その特定の特定の種類の次のイベントを無視することがわかります物体。

于 2012-10-26T12:22:03.050 に答える