2012-01-04 36 views
5

ネットワーク経由でQtアプリケーションにキーボードイベントとマウスイベントを注入し、このためにQCoreApplication::postEventを使用しています。マウス座標は絶対スクリーンピクセル座標です。QCoreApplication :: postEventを使用して合成入力イベントを挿入する方法

QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons, 
    Qt::NoModifier); 
QCoreApplication::postEvent(g_qtdraw.main.widget, event); 

は当初、私は(g_qtdraw.main.widgetによって参照)一つだけのウィジェットを持っていたので、私は単純にpostEventのための受信機の引数として1ということを使用しました。今では、私のアプリケーションに複数のウィジェットがあり、上記のコードは私がもう必要としていることをしません。

2番目のウィジェットはフルスクリーンモードで表示されていますが、すべてのマウスイベントはこのウィンドウに移動する必要がありますが、上記のコードではメインウィジェットに引き続きルーティングされています。

受信者(マウスx、y座標の下にあるもの)として正しいウィジェットを選択するにはどうすればよいですか? Qtが正しいウィジェットを選ぶか、自分でこれを追跡しなければならないように、標準的な方法はありますか?

私は今、正常に動作し、次の(Dusty Campbellに感謝を)使用編集

QPoint pos(x, y); 
QWidget *receiver = QApplication::widgetAt(pos); 
if (receiver) { 
    QMouseEvent *event = new QMouseEvent(type, receiver->mapFromGlobal(pos), mouse_button, 
     mouse_buttons, Qt::NoModifier); 
    QCoreApplication::postEvent(receiver, event); 
} 

答えて

8

は、あなたが位置に正しいウィジェットを見つけるためにQApplication::widgetAt()を使用し、それに投稿することができますか?

QPoint pos(x, y); 
QMouseEvent *event = new QMouseEvent(type, pos, mouse_button, mouse_buttons, Qt::NoModifier); 
QWidget *receiver = QApplication::widgetAt(pos); 
QCoreApplication::postEvent(receiver, event); 

私はあなたがキーイベントのためにこれを行う必要があるとは思わないでしょう。それらはフォーカスされたウィジェット(QApplication::focusWidget())に送信する必要があります。

残念ながら、私はこれをテストしていません。

+0

ありがとう、私はあなたのヒントを使用して動作するようになった。座標が正しいためには、receiver-> mapFromGlobal(pos)を使用しなければなりませんでした。 – trenki

3

私は署名があるdocumentationに応じていくつかのコードを投稿お勧めします:

void QCoreApplication::postEvent (QObject * receiver, QEvent * event) [static] 

Have対応するQObjectへのポインタをreceiver引数として指定しようとしましたか?

編集:QWidgetQObjectを継承することを注)

+0

私は新しい情報を追加しました。私は複数のウィンドウ/ウィジェットを持っている場合、どのように正しいもの(マウスx、yの下のもの)を選ぶのですか? – trenki

+0

ああ、ウィジェットの決定方法に関する重要な情報を見逃した;) –

関連する問題