当应用程序从另一台机器接收到指定消息时,我想让 PyQT4 窗口(QtGui.QMainWindow
)跳转到前面。通常窗口被最小化。
我尝试了raise_()
andshow()
方法,但它不起作用。
这有效:
# 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
提供焦点但不恢复最小化状态。
使用两者都有预期的效果。
这对我来说可以提高窗户但不能一直放在上面:
# bring window to top and act like a "normal" window!
window.setWindowFlags(window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) # set always on top flag, makes window disappear
window.show() # makes window reappear, but it's ALWAYS on top
window.setWindowFlags(window.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint) # clear always on top flag, makes window disappear
window.show() # makes window reappear, acts like normal window now (on top now but can be underneath if you raise another window)
我对上述方法没有任何运气,最终不得不直接使用 win32 api,在此处使用 C 版本的 hack 。这对我有用:
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()
对于使用 NVidia GPU 的 Windows 10 上的我来说,这很有效:
from PyQt4 import QtCore
# create window here...
window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
我在这个答案上找到了它:https ://stackoverflow.com/a/12280956/4549682
对于被这个问题激怒并且没有设法使用作为答案给出的任何一种方法来修复它的人(例如,对我来说,如果我在启动 python 脚本后但在 Qt 窗口出现之前立即单击另一个窗口,则 PyQt5 没有任何效果),这是最终对我有用的技巧:
wnd.showMinimized() # this is the trick: minimize first
wnd.show() # or wnd.showMaximized() if you want it shown maximized