2011-05-24 12 views
5

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?

+0

Gracias por nueva QMenu() pista! Ha solucionado mi problema. –

Respuesta

0

¿Podría decir qué compilador está utilizando? Creo que solía tener este problema también. Además de algunos otros problemas relacionados con iconos de bandejas (menús que solo mostrarían sombras, menús que se atascarían debajo de la barra de tareas, etc.)

Desde que cambié de Mingw32 al compilador de Visual Studio 2008, no me molestó yo más. Tal vez alguien más pueda dar más detalles sobre esto (ya que no soy un experto en desarrollo de Windows).

+0

Estoy usando Visual Studio 2010 Professional con el complemento QT – Rok

0

de conectar la señal aboutToHide() a la ranura deleteLater() para manejar la eliminación del menú

0

Parece que este problema se resolverá en Qt 4.8.0 acuerdo con this bug

2

La implementación de un QSystemTrayIcon en su QApplication derived class en lugar de algún QWidget puede solucionar este problema.

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(); 
} 
Cuestiones relacionadas