Я установил значок в системном трее для своего приложения и прикрепил к нему простое контекстное меню.Если я щелкну правой кнопкой мыши на значке, чтобы вызвать контекстное меню, он работает нормально.Если я затем щелкну где-нибудь, что теряет фокус приложения (например, в другом месте на панели задач или в другом приложении), контекстное меню не удаляется и при нажатии все равно вызывает правильное действие.Однако, если я нажимаю на главное приложение, контекстное меню исчезает, как и ожидалось.
Вот соответствующий код для создания иконки в трее и контекстного меню -
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( );
Нужно ли добавлятьмой собственный код, который проверяет, что приложение теряет фокус, чтобы я мог вручную скрыть контекстное меню?Я предполагал, что эта функциональность будет встроена.
[Проблема возникает в Windows 7, компилируется с Visual Studio 2010 Pro через плагин Qt - я не тестировал ни в одной другой ОС]
Я заметил это в документации API -
Примечание. Значок на панели задач не становится владельцем меню.Вы должны убедиться, что он удален в соответствующее время, например, путем создания меню с подходящим родительским объектом.
Если я использую
myTrayIconMenu = new QMenu( );
вместо
myTrayIconMenu = new QMenu( this );
контекстное меню удаляется, когда приложение теряет фокус.Но тогда мне нужно позаботиться об удалении контекстного меню вручную.
Как другие люди справились с этой ситуацией?