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 上,您可以使用 gdi32
和 user32
在桌面上绘图,如果您只需要水印,可以尝试这种方法。
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()
尝试使用 Qt 编写一个会在屏幕上放置水印的应用程序。 使用下面的标志可以让我的 window 出现在所有内容之上,除非用户在 Windows 照片中使用全屏模式。
self.setWindowFlags(
Qt.WindowTransparentForInput | Qt.WindowStaysOnTopHint |
Qt.FramelessWindowHint | Qt.Tool | Qt.MaximizeUsingFullscreenGeometryHint)
是否有可能在上述情况下强制 window 保持在顶部?即使用 user32 而无需为不同的框架重写所有内容。
在 windows 上,您可以使用 gdi32
和 user32
在桌面上绘图,如果您只需要水印,可以尝试这种方法。
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()