7

QT で QEvents を使用することを理解するために助けが必要です。これは私を夢中にさせています。

カスタムイベントを使ってアプリケーションを書いているのですが、QApplication::postEvent関数と同様に対象オブジェクトを指定する必要があります。

私が理解しているように、イベントをQtのイベントループに投稿することは可能です

QApplication::postEvent(obj_target, QEvent myevent);

これは、obj_target で「myevent」イベントをキャッチして何かをしようとしていることを意味します。

しかし、QMouseEvent や QKeyEvent のように、ターゲット オブジェクトを指定せずにイベントを投稿する必要があります。

  • つまり、多くのボタンを含む QMainWindow をクリックすると、どのボタンをクリックしてもそのボタンが押されるのはどうしてですか?

  • クリックイベントが投稿されたときの対象物は?

  • 特定のイベントを「リッスン」するオブジェクトを登録することは可能ですか?

私は本当に混乱しています。対象物を指定せずにイベントを投稿することは可能ですか?

事前にどうもありがとうございました

4

2 に答える 2

2

ダンが言ったように、イベントを「グローバルに」投稿する簡単な方法はありません。ネイティブイベントのすべてのイベントディスパッチは、プライベートQt実装コードによって実行されます。

重要な違いは次のとおりです。

  1. オペレーティングシステムによって配信されるネイティブメッセージ/イベントがあり、通常はウィンドウ固有のイベントループによって受信されます。

  2. QEventsがあります。

内部的には、Qtはトップレベルのウィジェット(実際にはウィンドウ)を追跡するため、OSからイベントを受信すると、どのウィンドウに移動するかがわかります。たとえば、プラットフォームウィンドウIDを使用して一致させることができます。

QEventQObject::event(QEvent*)オブジェクトにイベントを送信するということは、実際にはそのオブジェクトでメソッドが呼び出されることを意味するだけなので、オブジェクトを受信しないと配信は意味がありません。オブジェクトインスタンスがないと、このメソッドを呼び出すことはできません。

グローバルキープレスまたはマウスクリックイベントを合成する場合は、イベントがどのオブジェクトに移動するかを把握する必要があります。すなわち:

  1. イベントが移動するトップレベルウィンドウ(ウィジェット)を特定します。を介してトップレベルのウィジェットを列挙できますqApp->topLevelWidgets()

  2. イベントが移動する子ウィジェットを特定します。キーボードイベントの場合は、現在フォーカスされているウィジェットにイベントを送信するqApp->focusWidget()だけで十分です。子ウィジェットを列挙して、マウスの座標と重なるツリーで最も深いウィジェットを見つける必要があります。

  3. 識別したウィジェットに正しいQEventサブクラスを送信します。トップレベルのウィジェットに配信されたイベントは、正しい子ウィジェットにルーティングされます。

マウスイベントを送信するときは、関連するEnterイベントとLeaveイベントも合成する必要があります。そうしないと、ウィジェットが無効な状態のままになるリスクがあります。ソースファイルはapplication.cppそこにいくつかのアイデアを与えるはずです。

これでは、OSXのメニューなどのネイティブのグラフィカルアイテムにアクセスできません。

あなたがやろうとしていることを正確に教えてください。なぜ放送イベントを投稿したいのですか?誰がそれを受け取りますか?独自のQObject派生クラスがこれらのブロードキャストを受信するため、シグナルスロットメカニズムを使用するのは簡単だと思います。connect(...)これらのレシーバークラスを、いくつかのグローバルブロードキャスターQObjectの信号に単純に変換します。

于 2012-06-05T17:09:01.530 に答える