0

各モニターにQGraphicsViewsを備えたQGraphicsSceneを使用して、Qt 4.8でLinux(RHEL、Gnome、Compiz)用のアプリケーションを開発しています。各QGraphicsViewには、Qt::X11Bypasswindowmanagerhintウィンドウヒントがあります。キーボードフォーカスを復元するために、すべてのイベントのQGraphicsViewの1つでactivateWindow()を呼び出すイベントハンドラーがあります(これは、やり過ぎであり、非常に非効率的である可能性があります)。このアプリケーションは、ユーザーが頻繁に非表示および表示を要求できるアプリケーションです。イベントハンドラーでアクティブ化されている同じ特定のQGraphicsViewでshow()を呼び出すと、X11エラーイベントが発生します。特に、このエラーには、BadMatchエラーに対応するエラーコード8と、XSetInputFocus()に対応すると思われるメジャーオペレーションコード42があります。

まず、これはカスタムx11イベントハンドラーを介して単純に無視できるエラーですか(アプリケーションが実際に機能するため)?次に、QGraphicsViewでこの特定のウィンドウヒントを使用するときに、activateWindowを呼び出すためのより良い方法はありますか?そうでない場合は、少なくともこのエラーを回避する方法はありますか?

4

1 に答える 1

0

さて、私は自分の問題を解決したと思います。何が起こっていたのかというと、show()を呼び出すと、もちろんQEvent :: show()イベントが発生し、イベントフィルターがそれを取得します。したがって、showを呼び出した直後にウィンドウをアクティブ化しようとしましたが、ここで行った調査によると、これによりX11エラーが発生する可能性があります。解決策は、ウィジェットに対してshow()を呼び出した後に発生する、QEvent ::Enterイベントに対してのみactivateWindow()を呼び出すことです。これははるかに効率的であるだけでなく、テキストフィールドにキーボードフォーカスを正しく与え、これまでのところ、私のテストではX11エラーは発生しません。

于 2013-03-13T03:53:04.177 に答える