Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使pyqt应用程序停留在所有窗口的底部,如Rainmeter?_Qt_User Interface_Pyqt_Win32gui_Rainmeter - Fatal编程技术网

如何使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 Api
SetWindowPos
单击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)