Qt系统托盘上下文菜单保持当应用程序失去焦点

我为我的应用程序设置了一个系统托盘图标,并附加了一个简单的上下文菜单。 如果我右键单击图标调出上下文菜单,它工作正常。 如果我然后单击丢失应用程序焦点的地方(例如任务栏上或其他应用程序中的其他位置),上下文菜单不会被删除,并且在单击时仍会触发正确的操作。 但是,如果我点击主应用程序,上下文菜单会按预期消失。

以下是创build托盘图标和上下文菜单的相关代码 –

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( ); 

我是否需要添加自己的代码来testing失去焦点的应用程序,以便我可以手动隐藏上下文菜单? 我曾经假定这个function是内置的。

[问题出现在Windows 7中,通过Qt插件与Visual Studio 2010 Pro编译 – 我没有在任何其他操作系统下testing]

我在API文档中注意到了这一点 –

注意:系统托盘图标不占用菜单的所有权。 您必须确保在适当的时候删除它,例如通过创build具有合适父对象的菜单。

如果我使用

 myTrayIconMenu = new QMenu( ); 

代替

 myTrayIconMenu = new QMenu( this ); 

当应用程序失去焦点时,上下文菜单将被删除。 但是,我需要照顾手动删除上下文菜单。

其他人怎么处理这种情况呢?

在QApplication派生类中实现QSystemTrayIcon而不是QWidget可以解决这个问题。

main.cpp中:

 int main(int argc, char *argv[]) { return TestApp(argc, argv).exec(); } 

testApp.cpp:

 TestApp::TestApp(int &argc, char **argv) : QApplication(argc, argv) { quitAction = new QAction("quit", this); connect(quitAction, SIGNAL(triggered()), this, SLOT(quit())); systemTrayMenu = new QMenu("tray menu"); systemTrayMenu->addAction(quitAction); trayIcon = new QSystemTrayIcon( this); trayIcon -> setToolTip("test app"); connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); trayIcon -> setContextMenu(systemTrayMenu); trayIcon -> show(); } 

你能告诉你正在使用哪个编译器吗? 我想我也曾经有这个问题。 加上一些其他托盘图标相关的问题(只会显示阴影的菜单,将卡在任务栏下的菜单等)

自从我从Mingw32切换到Visual Studio 2008编译器以来,它一直不再困扰我。 也许别人可以详细说明这一点(因为我不是Windows开发专家)。

您可以将aboutToHide()信号连接到deleteLater()插槽来处理删除菜单

看来这个问题将根据这个bug在Qt 4.8.0中解决