【发布时间】:2022-01-23 02:21:51
【问题描述】:
我有这个应用程序,我试图在右键单击事件时关闭窗口,虽然该事件有效并且我的窗口已关闭,但右键单击也会发送到我的 python 应用程序下方存在的应用程序,因此是上下文菜单(如果存在)为该应用打开。
例如,如果我的 python 应用程序下方有 windows 桌面屏幕,则会打开 windows 的上下文菜单。
这是我尝试过的
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
import sys
class MainWindow(qtw.QMainWindow):
def __init__(self, *arg, **kwargs):
super().__init__(*arg, **kwargs)
self.setWindowFlag(qtc.Qt.FramelessWindowHint)
self.setAttribute(qtc.Qt.WA_TranslucentBackground)
self.setGeometry(100, 100, 400, 300)
self.showFullScreen()
self.setAttribute(qtc.Qt.WA_NoMousePropagation)
self.show()
def paintEvent(self, event):
qp = qtg.QPainter(self)
qp.setPen(qtg.QPen(qtc.Qt.blue, 1))
qp.drawRect(self.rect())
qp.setOpacity(0.01)
qp.setPen(qtc.Qt.NoPen)
qp.setBrush(self.palette().window())
qp.drawRect(self.rect())
# close on right click
def mousePressEvent(self, QMouseEvent):
if QMouseEvent.button() == qtc.Qt.LeftButton:
print("Left Button Clicked")
elif QMouseEvent.button() == qtc.Qt.RightButton:
self.close()
if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())
我尝试过使用 WA_NoMousePropagation 但这也不起作用。
OS: Windows 10
PyQt5==5.15.6
PyQt5-Qt5==5.15.2
PyQt5-sip==12.9.0
【问题讨论】:
-
我无法在 linux 上重现这个。但是,您可以改用上下文菜单信号来修复它。所以,在
MainWindow.__init__中,添加这两行:self.setContextMenuPolicy(qtc.Qt.CustomContextMenu); self.customContextMenuRequested.connect(self.close)。并删除鼠标按下事件处理程序。 -
您能否解释一下它的作用以及为什么不使用鼠标事件处理程序?
-
查看 Qt5 文档:contextMenuPolicy。鼠标按下事件与上下文菜单事件不同,因此处理它可能不会停止显式上下文菜单事件的传播。你试过我的建议了吗?正如我所说,我实际上无法在 linux 上重现该问题,因此我无法自己进行测试。
-
是的,我尝试了你的建议,它奏效了。
-
如果添加
contextMenuEvent处理程序(不设置上下文菜单策略),您应该会看到右键单击将同时传递鼠标按下事件和上下文菜单事件。在我的系统上,首先传递鼠标按下事件,然后调用close()不会停止以下上下文菜单事件。这表明一个可能的替代解决方案可能是执行self.setContextMenuPolicy(qtc.Qt.NoContextMenu),然后像以前一样处理鼠标按下事件。这应该会终止主窗口的所有上下文菜单事件。
标签: python pyqt pyqt5 mouseevent desktop-application