注册鼠标事件的不可见窗口

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

我要做的是本质上进行设置,以便在按住特定的组合键时(例如Ctrl + Shift),将显示一个不可见的对话框,该对话框覆盖了整个屏幕。诀窍是我需要此对话框来注册鼠标事件-例如移动并单击。

我的鼠标事件都可以正常工作,并且可以在常规小部件上做我需要的事情,但是我很难使它以我想要的方式工作。

我最近尝试过的操作是进行如下所示的对话框:

class MouseArea(QtGui.QDialog):
    def __init__(self):
        super(MouseArea, self).__init__()
        self.setMouseTracking(True)
        # Note - if you only have one monitor, you may want to turn of windowStaysOnTop when you
        # Disbale the transluscent background, or this will be real hard to close.
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        screen = QtGui.QApplication.desktop().screenNumber(QtGui.QApplication.desktop().cursor().pos())
        geo = QtGui.QApplication.desktop().screenGeometry(screen)

        self.move(geo.x(), geo.y())
        self.resize(geo.width(), geo.height())

    def mouseMoveEvent(self, event):
        # Included so you can see the translucent doesnt allow events to register
        print 'Mouse Moved!'
        return super(MouseArea, self).mouseMoveEvent(event)

这将在我调整大小/移动它以适合显示器时,在屏幕上放置一个不可见的窗口(工具标志,因此我们也不会为其添加任务栏,因此它完全不可见)。麻烦的是,由于它是半透明的,因此显然会使鼠标事件直接传递到其后面的小部件。禁用半透明功能后,我可以在整个屏幕上看到一个巨大的应用程序背景样式的彩色块,该块实际上会记录我的事件,但是现在我看不到任何东西,所以那并不理想。

我想要的是使它“清晰”-视觉上与半透明的background属性相同,但是要吸收所有鼠标事件。这些也不需要传递到其后面的窗口。仅当按住组合键时才会显示此窗口,在这种情况下,无论如何,这些事件并不意味着下面的窗口。

python mouseevent pyside invisible
1个回答
0
投票

我实际上通过覆盖绘画事件并在所需区域上绘制了具有1%不透明度的矩形来解决此问题。现在工作!

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