我正在尝试创建一个小部件来显示信息。该小部件旨在始终位于顶部,并在鼠标悬停在其上方时设置为隐藏,以便您可以单击或查看其下方的任何内容而不会中断,然后在鼠标离开该小部件后重新出现。我当前面临的问题是,一旦隐藏小部件,就不会绘制像素,因此不再跟踪鼠标活动,这会立即触发leaveEvent,因此小部件会不断闪烁。这是一个例子:
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt
class TransparentWindow(QWidget):
def __init__(self):
super().__init__()
# Set window attributes
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) # | Qt.WindowTransparentForInput)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setMouseTracking(True)
# Set example text
self.layout = QVBoxLayout()
self.label = QLabel(self)
self.label.setText("Hello, World!")
self.label.setStyleSheet("background-color: rgb(255, 255, 255); font-size: 50px;")
self.label.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
def enterEvent(self, event):
print("Mouse entered the window")
self.label.setHidden(True)
def leaveEvent(self, event):
print("Mouse left the window")
self.label.setHidden(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = TransparentWindow()
window.show()
sys.exit(app.exec_())
现在我尝试在其下方添加一个几乎透明的 Qwidget 项目,以便我可以使用这些几乎透明的像素拾取鼠标事件:
def __init__(self):
super().__init__()
# Set window attributes
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setMouseTracking(True)
# Set example text
self.layout = QVBoxLayout()
self.label = QLabel(self)
self.label.setText("Hello, World!")
self.label.setStyleSheet("background-color: rgb(255, 255, 255); font-size: 50px;")
self.label.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.label)
self.setLayout(self.layout)
# Set an almost transparent widget
self.box = QWidget(self)
self.box.setStyleSheet("background-color: rgba(255, 255, 255, 0.01)")
self.layout.addWidget(self.box)
这使得消失然后重新出现部分起作用。但我无法再单击其下方的任何内容。我尝试添加 Qt.WindowTransparentForInput,但它也使窗口对进入/离开事件透明。有什么解决方案可以使该窗口仅对单击事件透明,但对进入/离开事件不透明吗?或者我是否必须使用其他全局鼠标跟踪库才能完成这项工作?