ダンが言ったように、イベントを「グローバルに」投稿する簡単な方法はありません。ネイティブイベントのすべてのイベントディスパッチは、プライベートQt実装コードによって実行されます。
重要な違いは次のとおりです。
オペレーティングシステムによって配信されるネイティブメッセージ/イベントがあり、通常はウィンドウ固有のイベントループによって受信されます。
QEventsがあります。
内部的には、Qtはトップレベルのウィジェット(実際にはウィンドウ)を追跡するため、OSからイベントを受信すると、どのウィンドウに移動するかがわかります。たとえば、プラットフォームウィンドウIDを使用して一致させることができます。
QEvent
QObject::event(QEvent*)
オブジェクトにイベントを送信するということは、実際にはそのオブジェクトでメソッドが呼び出されることを意味するだけなので、オブジェクトを受信しないと配信は意味がありません。オブジェクトインスタンスがないと、このメソッドを呼び出すことはできません。
グローバルキープレスまたはマウスクリックイベントを合成する場合は、イベントがどのオブジェクトに移動するかを把握する必要があります。すなわち:
イベントが移動するトップレベルウィンドウ(ウィジェット)を特定します。を介してトップレベルのウィジェットを列挙できますqApp->topLevelWidgets()
。
イベントが移動する子ウィジェットを特定します。キーボードイベントの場合は、現在フォーカスされているウィジェットにイベントを送信するqApp->focusWidget()
だけで十分です。子ウィジェットを列挙して、マウスの座標と重なるツリーで最も深いウィジェットを見つける必要があります。
識別したウィジェットに正しいQEvent
サブクラスを送信します。トップレベルのウィジェットに配信されたイベントは、正しい子ウィジェットにルーティングされます。
マウスイベントを送信するときは、関連するEnterイベントとLeaveイベントも合成する必要があります。そうしないと、ウィジェットが無効な状態のままになるリスクがあります。ソースファイルはapplication.cpp
そこにいくつかのアイデアを与えるはずです。
これでは、OSXのメニューなどのネイティブのグラフィカルアイテムにアクセスできません。
あなたがやろうとしていることを正確に教えてください。なぜ放送イベントを投稿したいのですか?誰がそれを受け取りますか?独自のQObject派生クラスがこれらのブロードキャストを受信するため、シグナルスロットメカニズムを使用するのは簡単だと思います。connect(...)
これらのレシーバークラスを、いくつかのグローバルブロードキャスターQObjectの信号に単純に変換します。