【发布时间】:2011-09-01 05:26:54
【问题描述】:
我为我的应用设置了一个系统托盘图标,并为其附加了一个简单的上下文菜单。如果我右键单击该图标以调出上下文菜单,它就可以正常工作。如果我然后单击某个失去应用程序焦点的位置(例如,任务栏上的其他位置或另一个应用程序上),上下文菜单不会被删除,并且在单击时仍会触发正确的操作。但是,如果我单击主应用程序,上下文菜单会按预期消失。
这里是创建托盘图标和上下文菜单的相关代码-
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 中,通过 Qt 插件使用 Visual Studio 2010 Pro 编译 - 我没有在任何其他操作系统下测试过]
我在 API 文档中注意到了这一点 -
注意:系统托盘图标不会 拥有菜单的所有权。你必须 确保将其删除 适当的时间,例如, 使用合适的菜单创建菜单 父对象。
如果我使用
myTrayIconMenu = new QMenu( );
而不是
myTrayIconMenu = new QMenu( this );
当应用失去焦点时,上下文菜单会被移除。但是我需要手动删除上下文菜单。
其他人是如何处理这种情况的?
【问题讨论】:
-
感谢您提供新的 QMenu() 提示!它解决了我的问题。
标签: windows qt contextmenu system-tray qmenu