如何让 pyqt 应用程序像 Rainmeter 一样保持在所有 windows 的底部?

How to make pyqt app stay on bottom of all windows like Rainmeter?

我需要让我的 window 保持在底部。 我尝试使用 WindowStaysOnBottomHint,但是当单击 Win+DShow Desktop 时,应用程序会最小化。

我研究发现,当使用 Win32 Api SetWindowPos 单击“显示桌面”时,Rainmeter 会重新排序 Z-index,但我找不到 python QT 的解决方案。

求解答!!

一个简单的解决方法是检查 hideEvent() and ensure that the event is spontaneous (meaning that the event was originated from outside the application, like from the system in your case), and then call 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 的解决方案(仅适用于 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 window