2012-08-25 76 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()