我正在尝试使用 PyQt 为 Windows 10 创建桌面应用程序。
该应用程序将是一个叠加层,因此它必须是透明的、可点击的并且始终位于顶部。对象检测器将检测一些感兴趣的区域,并在该区域中绘制一个矩形。
覆盖几乎没问题。现在它能够绘制随机矩形,而背景是透明的,你可以点击背景。问题是我无法点击矩形。
我已经尝试过该WA_TransparentForMouseEvents
属性,但它无法正常工作。当我设置此属性时,按钮停止工作(我希望这种行为,我不在乎,因为按钮只是用于调试),但我仍然无法单击按钮或矩形。
这是我的代码示例:
import sys
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QBrush, QColor, QPainter, QPen
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QStackedWidget
import numpy as np
class OverlayScreen(QMainWindow):
def __init__(self):
super().__init__()
self.setFixedHeight(1080)
self.setFixedWidth(1920)
self.setObjectName("overlay")
self.setStyleSheet("QMainWindow#overlay {background-color: rgba(0, 0, 0, 125)}")
self.bg_transparent = False
self.toggle_btn = QPushButton("Toggle", self)
self.toggle_btn.setGeometry(200, 150, 100, 30)
self.toggle_btn.clicked.connect(self.toggle_background)
self.draw_btn = QPushButton("Draw rectangle", self)
self.draw_btn.setGeometry(320, 150, 100, 30)
self.draw_btn.clicked.connect(self.draw_rectangle)
self.rectangles = []
self.close_btn = QPushButton("Close", self)
self.close_btn.setGeometry(200, 200, 100, 30)
self.close_btn.clicked.connect(sys.exit)
def toggle_background(self):
self.bg_transparent = not self.bg_transparent
if self.bg_transparent:
self.setStyleSheet("QMainWindow#overlay {background-color: transparent}")
else:
self.setStyleSheet("QMainWindow#overlay {background-color: rgba(0, 0, 0, 125)}")
def draw_rectangle(self):
# self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents)
rect = [np.random.randint(1920 - 150),
np.random.randint(1080 - 100),
np.random.randint(150),
np.random.randint(100)]
self.rectangles.append(rect)
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(Qt.GlobalColor.green, 1))
painter.setBrush(QBrush(QColor(0, 255, 0, 80), Qt.BrushStyle.SolidPattern))
for rect in self.rectangles:
painter.drawRect(*rect)
painter.end()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = QStackedWidget()
main.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
main.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
main.move(0, 0)
overlay = OverlayScreen()
main.addWidget(overlay)
main.show()
try:
sys.exit(app.exec())
except Exception:
print("Error")