0

我正在尝试使用 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")
4

0 回答 0