アプリのシステムトレイアイコンを設定し、それにシンプルなコンテキストメニューを添付しました。アイコンを右クリックしてコンテキストメニューを表示すると、正常に機能します。次に、アプリのフォーカスを失う場所(タスクバーや別のアプリなど)をクリックしても、コンテキストメニューは削除されず、クリックすると正しいアクションがトリガーされます。ただし、メインアプリをクリックすると、コンテキストメニューが期待どおりに消えます。
トレイアイコンとコンテキストメニューを作成するための関連コードは次のとおりです-
actionExit = new QAction( "Exit", this );
connect( actionExit, SIGNAL( triggered() ), this, SLOT( ExitClient() ));
myTrayIconMenu = new QMenu( this );
myTrayIconMenu->addAction( actionExit );
trayIcon = new QSystemTrayIcon( icon, this );
trayIcon->setContextMenu( myTrayIconMenu );
connect( systrayIcon, SIGNAL( activated( QSystemTrayIcon::ActivationReason )),
this, SLOT( ToggleVisibility( QSystemTrayIcon::ActivationReason )));
trayIcon->show( );
コンテキストメニューを手動で非表示にできるように、アプリがフォーカスを失うことをテストする独自のコードを追加する必要がありますか?私はこの機能が組み込まれると思っていました。
[この問題はWindows7で発生しており、Qtプラグインを介してVisual Studio2010Proでコンパイルされています。他のOSではテストしていません]
APIドキュメントでこれに気づきました-
注:システムトレイアイコンはメニューの所有権を取得しません。たとえば、適切な親オブジェクトを使用してメニューを作成することにより、適切なタイミングで削除されるようにする必要があります。
使用する場合
myTrayIconMenu = new QMenu( );
それ以外の
myTrayIconMenu = new QMenu( this );
アプリがフォーカスを失うと、コンテキストメニューは削除されます。ただし、コンテキストメニューを手動で削除する必要があります。
他の人はこの状況にどのように対処しましたか?