2012-08-25 9 views
14

Quiero hacer que una ventana PyQT4 (QtGui.QMainWindow) salte al frente cuando la aplicación recibió un mensaje específico de otra máquina. Por lo general, la ventana está minimizada.¿Cómo hacer que una ventana PyQT4 salte al frente?

Probé el método raise_() y show() pero no funciona.

Respuesta

13

Esto funciona:

# 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() 

Ambos son necesarios para mí en Win7.

setWindowState restaura la ventana minimizada y le da enfoque. Pero si la ventana simplemente pierde el enfoque y no se minimiza, no dará el foco.

activateWindow da enfoque pero no restaura el estado minimizado.

El uso de ambos tiene el efecto deseado.

+1

Muchas gracias. Funciona. – redice

+0

¡Esto no funciona para mí si estoy ejecutando mi ventana desde la terminal! –

+0

¡Funcionó bien en Ubuntu Unity! –

3

No he tenido suerte con los métodos anteriores, terminé teniendo que usar la api win32 directamente, usando un hack para la versión C here. Esto funcionó para mí:

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