如何设置QWidget在鼠标悬停时隐藏并在鼠标离开时重新出现?

问题描述 投票:0回答:1

我正在尝试创建一个小部件来显示信息。该小部件旨在始终位于顶部,并在鼠标悬停在其上方时设置为隐藏,以便您可以单击或查看其下方的任何内容而不会中断,然后在鼠标离开该小部件后重新出现。我当前面临的问题是,一旦隐藏小部件,就不会绘制像素,因此不再跟踪鼠标活动,这会立即触发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,但它也使窗口对进入/离开事件透明。有什么解决方案可以使该窗口仅对单击事件透明,但对进入/离开事件不透明吗?或者我是否必须使用其他全局鼠标跟踪库才能完成这项工作?

python qt user-interface pyqt pyqt5
1个回答
0
投票

根本没有绘制的像素也不会接收任何鼠标输入。

如果你想完全隐藏它唯一的方法就是使用鼠标跟踪

或者只是使用“rgba”来设置不透明度的文本颜色

© www.soinside.com 2019 - 2024. All rights reserved.