He configurado un icono de la bandeja del sistema para mi aplicación y le he adjuntado un menú contextual simple. Si hago clic derecho en el icono para que aparezca el menú contextual, funciona bien. Si a continuación, hago clic en algún lugar que pierda el foco de la aplicación (por ejemplo, en otra parte de la barra de tareas o en otra aplicación), el menú contextual no se elimina y todavía se activa la acción correcta al hacer clic. Sin embargo, si hago clic en la aplicación principal, el menú contextual desaparece como se esperaba.El menú contextual de la bandeja del sistema Qt permanece cuando la aplicación pierde el foco
Aquí está el código correspondiente para crear el icono de la bandeja y el menú contextual -
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();
¿Es necesario añadir mi propio código que examina la aplicación de perder el foco de modo que pueda ocultar manualmente el menú de contexto? Yo había asumido esta funcionalidad se construiría en
[El problema se produce en Windows 7, compilar con Visual Studio 2010 Pro a través de Qt plug-in - No he probado en cualquier otro sistema operativo].
I se dio cuenta de esto en la documentación de API -
Nota: El icono de la bandeja del sistema no toma el control del menú . Debe asegurarse de que se elimine en el momento apropiado , por ejemplo, creando el menú con un objeto primario adecuado .
Si uso
myTrayIconMenu = new QMenu();
en lugar de
myTrayIconMenu = new QMenu(this);
el menú contextual se elimina cuando la aplicación pierde el foco. Pero luego tendré que ocuparme de eliminar manualmente el menú contextual.
¿Cómo han lidiado otras personas con esta situación?
Gracias por nueva QMenu() pista! Ha solucionado mi problema. –