Как заставить окно 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)