Как заставить окно PyQT4 перейти на передний план?
Я хочу, чтобы окно PyQT4 (QtGui.QMainWindow
) прыгало вперед, когда приложение получило указанное сообщение с другого компьютера.
Обычно окно минимизируется.
Я пробовал метод raise_()
и show()
, но он не работает.
Ответы
Ответ 1
Это работает:
# 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
дает фокус, но не восстанавливает минимизированное состояние.
Использование обоих параметров имеет желаемый эффект.
Ответ 2
Мне не повезло с вышеуказанными методами, в итоге мне пришлось напрямую использовать win32 api, используя взломать версию C здесь. Это сработало для меня:
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()
Ответ 3
Это работает для меня, чтобы поднять окно, но НЕ держать его сверху:
# 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 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)