我需要让我的窗口保持在底部。我尝试使用WindowStaysOnBottomHint
,但是当单击Win+D
或时Show Desktop
,应用程序最小化。
我研究并发现当使用 Win32 Api 单击显示桌面时,Rainmeter 会重新排序 Z-index,SetWindowPos
但我无法找到 python QT 的解决方案。
请给我解决方案!!
我需要让我的窗口保持在底部。我尝试使用WindowStaysOnBottomHint
,但是当单击Win+D
或时Show Desktop
,应用程序最小化。
我研究并发现当使用 Win32 Api 单击显示桌面时,Rainmeter 会重新排序 Z-index,SetWindowPos
但我无法找到 python QT 的解决方案。
请给我解决方案!!
一个简单的解决方法是检查hideEvent()
并确保事件是自发的(这意味着事件源自应用程序外部,例如您的情况下来自系统),然后调用showNormal()
:
class MyWindow(QtWidgets.QWidget):
# ...
def hideEvent(self, event):
if event.spontaneous():
self.showNormal()
为了安全起见,您还可以检查changeEvent()
和过滤WindowStateChange
事件:
def changeEvent(self, event):
if (event.type() == QtCore.QEvent.WindowStateChange and
event.spontaneous() and
self.windowState() == QtCore.Qt.WindowMinimized):
self.showNormal()
我找到了使用 win32 API for python (Only for windows) 的解决方案。参考SetWindowPos , SetWindowLong , win32gui
if sys.platform=='win32':
from ctypes import windll
import win32gui,win32con
win32gui.SetWindowPos(window.winId(),win32con.HWND_BOTTOM, 0,0,0,0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_NOACTIVATE )
hwnd=win32gui.GetWindow(win32gui.GetWindow(windll.user32.GetTopWindow(0),win32con.GW_HWNDLAST),win32con.GW_CHILD);
win32gui.SetWindowLong(window.winId(),win32con.GWL_HWNDPARENT,hwnd)
window
是 QTWidget 窗口