Qt5 - 全屏时强制保持在顶部

Qt5 - Force stay on top during fullscreen

尝试使用 Qt 编写一个会在屏幕上放置水印的应用程序。 使用下面的标志可以让我的 window 出现在所有内容之上,除非用户在 Windows 照片中使用全屏模式。

self.setWindowFlags(
        Qt.WindowTransparentForInput | Qt.WindowStaysOnTopHint |
        Qt.FramelessWindowHint | Qt.Tool | Qt.MaximizeUsingFullscreenGeometryHint)

是否有可能在上述情况下强制 window 保持在顶部?即使用 user32 而无需为不同的框架重写所有内容。

在 windows 上,您可以使用 gdi32user32 在桌面上绘图,如果您只需要水印,可以尝试这种方法。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWebEngineWidgets import QWebEngineView

from ctypes.wintypes import HDC, HWND, RECT

from ctypes import windll

GetDC = windll.user32.GetDC
ReleaseDC = windll.user32.ReleaseDC
SetTextColor = windll.gdi32.SetTextColor
DrawText = windll.user32.DrawTextW

class Watermark(QtCore.QObject):
    def __init__(self, parent = None):
        super().__init__(parent)
        self._text = None
        self._visible = False
        timer = QtCore.QTimer()
        timer.setInterval(10)
        timer.timeout.connect(self.onTimeout)
        timer.start()
        self._timer = timer
        
    def setText(self, text):
        self._text = text

    def show(self):
        self._visible = True
    
    def onTimeout(self):
        if not self._visible or self._text is None:
            return
        rect = RECT()
        hwnd = 0
        hdc = GetDC(hwnd)
        rect.left = 0
        rect.top = 0
        rect.bottom = 100
        rect.right = 100
        SetTextColor(hdc, 0x00000000)
        DT_SINGLELINE = 0x00000020
        DT_NOCLIP = 0x00000100
        DrawText(hdc, self._text, -1, rect, DT_SINGLELINE | DT_NOCLIP) 
        ReleaseDC(hwnd, hdc)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    watermark = Watermark()
    watermark.setText("This stays on top")
    watermark.show()
    app.exec()