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



我想要做的是基本上设置一些东西,以便在按住特定的组合键(例如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)

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

我想要的是让它"清晰" - 在视觉上与半透明背景属性相同,但它需要所有鼠标事件。这些也不需要穿过它后面的窗户。此窗口仅在按住组合键时显示,在这种情况下,事件无论如何都不适用于下面的窗口。

实际上,我设法通过覆盖绘画事件并在我需要的区域上绘制一个不透明度为 1% 的矩形来解决这个问题。现在工作!

最新更新