0

Qt アプリケーションのテストを作成しようとしています。目的は、X11 ライブラリを使用してマウスを動かし、QGraphicsItems または QWidgets をクリックして、アプリケーションの GUI をテストすることです。

テストは私の Qt アプリケーションのプラグインとして書かれています。別の QThread を起動し、run() 関数でマウスの移動を行います。これを「テスト実行中のスレッド」と呼びましょう

ただし、GUI の構造、つまりさまざまなウィジェットの場所も取得する必要があるため、「テスト実行スレッド」で QApplication::topLevelWidgets() を調べて、関心のあるものを見つけます。次に mapToGlobal( を呼び出します) ) をこのウィジェットで使用して、そのグローバル位置を取得します。この位置を X11 マウス関数に供給して、ウィジェット上でマウスを移動できます。

これは通常は機能しますが、時々このエラー「Xlib:予期しない非同期応答」が表示されます。グーグルで調べたところ、QWidget の位置を設定したり、別のスレッドからそれらを更新しようとしたことが原因である可能性があることが明らかになりました。

しかし、別のスレッドでウィジェットに関する情報を取得するだけです。なぜそれが問題を引き起こすのでしょうか? :(

他のすべてが失敗した場合は、何らかの通信キューをメイン (GUI) スレッドに戻す準備ができています。「テスト実行スレッド」は、ウィジェットに関する情報の要求をキューに配置し、GUI スレッドはそれらに応答できます。

プラグインがマウスを動かすために別のスレッドを起動する理由は、GUI がイベントに応答し続ける必要があるためです。そうしないと、演習のポイント全体が失われます。スレッドを使用することもでき、プロセスイベント() を定期的に呼び出しているメインスレッドでマウスを動かすだけでよいこともわかっています。それが私が推測する他のオプションです。

以前にこのルートをたどった人からのアイデアは非常に役に立ちます。ありがとう !

4

1 に答える 1