如何使pyqt应用程序停留在所有窗口的底部,如Rainmeter?
我需要让我的窗户保持在底部。 我尝试使用如何使pyqt应用程序停留在所有窗口的底部,如Rainmeter?,qt,user-interface,pyqt,win32gui,rainmeter,Qt,User Interface,Pyqt,Win32gui,Rainmeter,我需要让我的窗户保持在底部。 我尝试使用WindowStaysOnBottomHint但当单击Win+D或Show Desktop时,应用程序最小化 我研究发现,当使用Win32 ApiSetWindowPos单击Show Desktop时,Rainmeter会重新排序Z索引,但我无法找到python QT的解决方案 请给我答案 一个简单的解决方法是检查并确保事件是(这意味着事件来自应用程序外部,如您的案例中的系统),然后调用: 为了安全起见,您还可以检查并筛选WindowsStateChang
WindowStaysOnBottomHint
但当单击Win+D
或Show Desktop
时,应用程序最小化
我研究发现,当使用Win32 ApiSetWindowPos
单击Show Desktop时,Rainmeter会重新排序Z索引,但我无法找到python QT的解决方案
请给我答案 一个简单的解决方法是检查并确保事件是(这意味着事件来自应用程序外部,如您的案例中的系统),然后调用: 为了安全起见,您还可以检查并筛选
WindowsStateChange
事件:
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(仅适用于windows)的解决方案。参考
窗口
是QTWidget窗口单击显示桌面
时未触发hideEvent和changeEvent。单击Show Desktop
时,窗口可能不会最小化。我也在Manjaro操作系统中尝试过这个,并且hideEvent
被触发,但是小部件仍然最小化了!我尝试使用旧的windows版本,因此新的实现可能不会触发该事件(根据文档,即使应该触发)。在Linux上,这可能取决于窗口管理器的行为,因为并非所有都遵守X11标准。如果在If
中添加一个简单的print语句,它会被打印吗?如果没有,我能想到的唯一替代方法是通过在changeEvent中打印所有事件来进行自己的调试,并尝试获取触发的事件:使用print(event,event.type())
并将其与。是的,我尝试了print(event,event.type())
并发现单击“显示桌面”时未触发任何事件。感谢您的帮助,我终于找到了答案,并将其发布。
def changeEvent(self, event):
if (event.type() == QtCore.QEvent.WindowStateChange and
event.spontaneous() and
self.windowState() == QtCore.Qt.WindowMinimized):
self.showNormal()
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)