我希望实现一个 PyQT4 窗口(QtGui.QMainWindow
),当应用程序从另一台机器接收到指定消息时,窗口能够跳到前面。通常情况下,该窗口处于最小化状态。
我尝试过使用 raise_()
和 show()
方法,但都没有效果。
这个是有效的:
# 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)
window.setWindowFlags(window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint); window.show()
- Waxrat我尝试了上述方法都没有成功,最终不得不直接使用win32 api,在C版本中使用一个hack 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()
def reShow(self):
self.showMinimized()
self.setWindowState(self.windowState() and (not QtCore.Qt.WindowMinimized or QtCore.Qt.WindowActive))
from PyQt4 import QtCore
# create window here...
window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
我在这个答案中找到了它:https://dev59.com/dmct5IYBdhLWcg3wLqnx#12280956
对于那些因此问题感到恼火并且没有成功使用提供的任何方法来解决它(例如,如果我在启动Python脚本但Qt窗口出现之前立即单击另一个窗口,则PyQt5对我无效),这里是最终为我工作的技巧:
wnd.showMinimized() # this is the trick: minimize first
wnd.show() # or wnd.showMaximized() if you want it shown maximized
show()
和顺序raise_()
对我来说工作得很好。 - Konstantin Burlachenko