2012-08-25 10 views
14

Ich möchte ein PyQT4-Fenster (QtGui.QMainWindow) in den Vordergrund springen, wenn die Anwendung eine bestimmte Nachricht von einem anderen Rechner erhalten hat. Normalerweise ist das Fenster minimiert.Wie kann man ein PyQT4-Fenster nach vorne springen lassen?

Ich versuchte die raise_() und show() Methode, aber es funktioniert nicht.

Antwort

13

Dies funktioniert:

# this will remove minimized status 
# and restore window with keeping maximized/normal state 
window.setWindowState(window.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) 

# this will activate the window 
window.activateWindow() 

Sowohl für mich auf Win7 erforderlich sind.

setWindowState stellt das minimierte Fenster wieder her und gibt den Fokus. Aber wenn das Fenster gerade den Fokus verliert und nicht minimiert wird, wird es keinen Fokus geben.

activateWindow gibt Fokus, aber stellt den minimierten Zustand nicht wieder her.

Die Verwendung beider hat den gewünschten Effekt.

+1

Vielen Dank. Es funktioniert. – redice

+0

Dies funktioniert nicht für mich, wenn ich mein Fenster vom Terminal aus führe !!! –

+0

Arbeitete gut unter Ubuntu Unity! –

3

Ich hatte kein Glück mit den oben genannten Methoden, musste am Ende die win32 api direkt verwenden, mit einem Hack für die C-Version here. Dies funktionierte für mich:

from win32gui import SetWindowPos 
import win32con 

SetWindowPos(window.winId(), 
      win32con.HWND_TOPMOST, # = always on top. only reliable way to bring it to the front on windows 
      0, 0, 0, 0, 
      win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_SHOWWINDOW) 
SetWindowPos(window.winId(), 
      win32con.HWND_NOTOPMOST, # disable the always on top, but leave window at its top position 
      0, 0, 0, 0, 
      win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_SHOWWINDOW) 
window.raise_() 
window.show() 
window.activateWindow() 
Verwandte Themen