Le menu contextuel de la barre d’état système Qt rest lorsque l’application perd le focus

J’ai mis en place une icône de la barre d’état système pour mon application et y ai attaché un simple menu contextuel. Si je clique avec le bouton droit sur l’icône pour faire apparaître le menu contextuel, cela fonctionne bien. Si je clique ensuite sur quelque part qui perd le focus de l’application (par exemple ailleurs sur la barre des tâches ou sur une autre application), le menu contextuel n’est pas supprimé et déclenche toujours l’action correcte lorsque l’utilisateur clique dessus. Si, cependant, je clique sur l’application principale, le menu contextuel disparaît comme prévu.

Voici le code approprié pour créer l’icône de la barre des tâches et le menu contextuel –

actionExit = new QAction( "Exit", this ); connect( actionExit, SIGNAL( sortingggered() ), 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( ); 

Dois-je append mon propre code qui teste la perte de concentration de l’application afin de pouvoir masquer manuellement le menu contextuel? J’avais supposé que cette fonctionnalité serait intégrée.

[Le problème se produit dans Windows 7, la compilation avec Visual Studio 2010 Pro via le plug-in Qt – Je n’ai pas testé sous un autre système d’exploitation]

Je l’ai remarqué dans la documentation de l’API –

Remarque: L’icône de la barre d’état système ne prend pas possession du menu. Vous devez vous assurer qu’il est supprimé au moment approprié, par exemple en créant le menu avec un object parent approprié.

Si j’utilise

 myTrayIconMenu = new QMenu( ); 

au lieu de

 myTrayIconMenu = new QMenu( this ); 

le menu contextuel est supprimé lorsque l’application perd le focus. Mais alors je devrai prendre soin de supprimer manuellement le menu contextuel.

Comment les autres personnes ont-elles géré cette situation?

L’implémentation d’un QSystemTrayIcon dans votre classe dérivée QApplication au lieu de QWidget peut résoudre ce problème.

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(sortingggered()), 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(); } 

Pouvez-vous dire quel compilateur vous utilisez? Je pense que j’avais aussi ce problème. De plus, d’autres problèmes liés aux icons de la barre des tâches (menus ne montrant que des ombres, des menus qui restraient bloqués sous la barre des tâches, etc.)

Depuis que je suis passé de Mingw32 au compilateur Visual Studio 2008, cela ne me dérange plus. Peut-être que quelqu’un d’autre peut élaborer à ce sujet (puisque je ne suis pas expert en développement Windows).

Vous pouvez connecter le signal deleteLater() emplacement deleteLater() pour gérer la suppression du menu

Il semble que ce problème sera résolu dans Qt 4.8.0 en fonction de ce bogue