2012-08-25 43 views
14

我想让PyQT4窗口(QtGui.QMainWindow)在应用程序从另一台机器收到指定消息时跳转到前面。 通常窗口被最小化。如何让PyQT4窗口跳到前面?

我试过raise_()show()方法,但它不起作用。

回答

13

这工作:

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

两者都需要对我Win7上。

setWindowState恢复最小化窗口并给出焦点。但是如果这个窗口只是失去了焦点而没有被最小化,那么它就不会重点关注。

activateWindow给出焦点但不恢复最小化状态。

使用两者都有理想的效果。

+1

非常感谢。它确实有效。 – redice

+0

如果我从终端运行我的窗口,这不适用于我! –

+0

在Ubuntu Unity下工作正常! –

3

我对上述方法没有任何好运,结果不得不直接使用win32 api,使用C版本here的黑客。这对我有效:

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