2012-08-25 21 views
14

Voglio fare una finestra PyQT4 (QtGui.QMainWindow) saltare in primo piano quando l'applicazione ha ricevuto un messaggio specificato da un'altra macchina. Di solito la finestra è ridotta a icona.Come far saltare in primo piano una finestra PyQT4?

Ho provato il metodo raise_() e show() ma non funziona.

risposta

13

Questo funziona:

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

Entrambi sono necessari per me su Win7.

setWindowState ripristina la finestra ridotta a icona e dà la messa a fuoco. Ma se la finestra ha appena perso la messa a fuoco e non ridotta a icona, non darà fuoco.

activateWindow dà fuoco ma non ripristina lo stato ridotto al minimo.

L'utilizzo di entrambi ha l'effetto desiderato.

+1

Grazie mille. Funziona. – redice

+0

Questo non funziona per me se sto facendo funzionare la mia finestra dal terminale !!! –

+0

Ha funzionato bene con Ubuntu Unity! –

3

Non ho avuto fortuna con i metodi precedenti, ho finito per dover usare direttamente l'API di win32, usando un hack per la versione C here. Questo ha funzionato per me:

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() 
Problemi correlati