我已经为我的应用设置了系统任务栏图标,并为其附加了一个简单的上下文菜单。如果我右键单击该图标以调出上下文菜单,则可以正常工作。如果然后我单击失去应用程序焦点的某个位置(例如任务栏上的其他位置或另一个应用程序),则上下文菜单不会被删除,并且在单击时仍会触发正确的操作。但是,如果我单击主应用程序,则上下文菜单会按预期消失。
以下是用于创建任务栏图标和上下文菜单的相关代码-
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 );
当应用失去焦点时,上下文菜单将被删除。但随后,我将需要手动删除上下文菜单。
其他人如何处理这种情况?
最佳答案
在QApplication派生类中而不是某些QWidget中实现QSystemTrayIcon可以解决此问题。
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();
}
关于windows - 当应用失去焦点时,Qt系统托盘上下文菜单仍然存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6115766/