QtGui.QMainWindow
アプリケーションが別のマシンから指定されたメッセージを受信したときに、PyQT4 window()を前面にジャンプさせたい。通常、ウィンドウは最小化されます。
raise_()
andメソッドを試しました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)
私は上記の方法で運がなかったので、ここでCバージョンのハックを使用してwin32apiを直接使用する必要がありました。これは私のために働いた:
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()
NVidiaGPUを搭載したWindows10の私にとって、これは機能しました。
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