Qt 4.4.1 アプリケーションがいつフォーカスを受け取るかを判断する必要があります。
私は2つの可能な解決策を考え出しましたが、どちらも希望どおりに機能しません。
最初の可能な解決策では、qApp からの focusChanged() シグナルを SLOT に接続します。スロットで、「古い」ポインターを確認します。'0' の場合、このアプリケーションに切り替えたことがわかり、やりたいことを実行します。これは、ここで紹介する 2 つのソリューションの中で、アプリケーションにフォーカスを検出させる最も信頼できる方法のようですが、以下に説明する問題があります。
考えられる 2 番目の解決策では、「focusInEvent()」ルーチンをオーバーライドし、理由が「ActiveWindowFocusReason」である場合に必要なことを行います。
これらのソリューションの両方で、コードが実行されたくないときにコードが実行されます。
たとえば、focusInEvent() ルーチンをオーバーライドする次のコードがあります。
void
ApplicationWindow::focusInEvent( QFocusEvent* p_event )
{
Qt::FocusReason reason = p_event->reason();
if( reason == Qt::ActiveWindowFocusReason &&
hasNewUpstreamData() )
{
switch( QMessageBox::warning( this, "New Upstream Data Found!",
"New upstream data exists!\n"
"Do you want to refresh this simulation?",
"&Yes", "&No", 0, 0, 1 ) )
{
case 0: // Yes
refreshSimulation();
break;
case 1: // No
break;
}
}
}
これが実行されると、QMessageBox ダイアログが表示されます。ただし、「はい」または「いいえ」のいずれかを押してダイアログを閉じると、この関数がすぐに再度呼び出されます。これは、ActiveWindowFocusReason を使用してその時点でフォーカスがアプリケーション ウィンドウに戻ったと思われるためです。明らかに、私はこれが起こることを望んでいません。
同様に、ユーザーがダイアログやウィンドウなどを開いたり閉じたりするアプリケーションを使用している場合、このルーチンをアクティブにしたくありません。注:少し試してみたので、このルーチンがアクティブになる状況はわかりません。すべてのウィンドウとダイアログで発生するわけではありませんが、少なくともサンプルコードに示されているものでは発生します。 .
メインウィンドウが他のダイアログウィンドウからフォーカスされたときではなく、アプリケーションがこのアプリケーションの外部からフォーカスされた場合にのみアクティブにしたい。
これは可能ですか?これはどのように行うことができますか?
これは私たちのアプリケーションにとって非常に重要なので、情報をありがとう。
レイモンド。