我要做的是本质上进行设置,以便在按住特定的组合键时(例如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属性相同,但是要吸收所有鼠标事件。这些也不需要传递到其后面的窗口。仅当按住组合键时才会显示此窗口,在这种情况下,无论如何,这些事件并不意味着下面的窗口。
我实际上通过覆盖绘画事件并在所需区域上绘制了具有1%不透明度的矩形来解决此问题。现在工作!