如何使pyqt应用程序停留在Rainmeter之类的所有窗口的底部?

问题描述

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

我研究发现,当使用Win32 Api SetwindowPos单击Show Desktop时,Rainmeter重新排列Z索引,但是我找不到python QT的解决方案。

请给我解决方法

解决方法

一个简单的解决方法是检查hideEvent()并确保事件为spontaneous(这意味着该事件源自应用程序外部,例如您的系统)。致电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)。请参阅SetWindowPosSetWindowLongwin32gui

if sys.platform=='win32':
    from ctypes import windll
    import win32gui,win32con
    win32gui.SetWindowPos(window.winId(),win32con.HWND_BOTTOM,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窗口

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...