31 votes

Mettre la fenêtre en avant -> raise(),show(),activateWindow() ne fonctionnent pas

Dans mon application Qt, j'ouvre une URL dans le navigateur par défaut. Ensuite, je veux ramener la fenêtre principale de mon application au premier plan.

J'ai essayé toutes les approches que j'ai pu trouver, mais aucune n'a fonctionné. Tout ce qu'il fait c'est clignoter dans la barre des tâches (de Window 7) Voici un exemple :

this->viewer->show();
this->viewer->raise();
this->viewer->activateWindow();

*viewer est un pointeur vers un QmlApplicationViewer qui est dérivé de QDeclarativeView.

36voto

iptton Points 473

Essayez ceci :

viewer.setWindowState( (windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
viewer.raise();  // for MacOS
viewer.activateWindow(); // for Windows

cela fonctionne dans mon projet (dans mon projet le viewer est QMainWindow) : https://github.com/iptton/Rythem .

8voto

Sunburst275 Points 325

Je l'ai fait comme ça :

{
 this->show(); // Restore from systray
 this->setWindowState(Qt::WindowState::WindowActive); // Bring window to foreground
}

en assumant " this " est votre QMainWindow . Cela a marché comme un charme.

7voto

user763305 Points 6123

Ce problème est spécifique à Windows. Si la fenêtre active appartient à un processus, alors Windows ne permet pas aux autres processus de modifier la fenêtre active.

(N'essayez pas ce qui suit : https://wiki.qt.io/Qt_project_org_faq#QWidget_::activateWindow.28.29_-_behavior_under_windows )

3voto

agnu17 Points 398
for ( QWindow* appWindow : qApplication.allWindows() )
{
  appWindow->show(); //bring window to top on OSX
  appWindow->raise(); //bring window from minimized state on OSX

  appWindow->requestActivate(); //bring window to front/unminimize on windows
}

Notez que cela fait également apparaître la fenêtre d'autres bureaux virtuels sous OSX et Windows. Je n'ai pas testé cela sur linux, mais cela peut fonctionner.

2voto

Bruce Chidester Points 426

Ce problème n'est pas spécifique à Windows..... J'ai le même problème sous Linux. Ma solution a été de fermer() la fenêtre avant de la rouvrir().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X