我正在制作一个菜单栏,但是当子菜单打开时,我无法按窗口的 X 按钮,而且当我按其外部时菜单会关闭。我打算忽略菜单中发生的所有鼠标事件。
看来是因为事件完全重定向到了菜单栏。因此,installEventFilter和虚函数可能对此问题没有影响。
我也尝试了
menu.releaseMouse
和menu.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
,但没有成功。
有没有办法将鼠标事件重定向到窗口,或者可以在不关闭菜单的情况下按下X按钮?
下面是一些将用于创建测试菜单的代码:
from PySide2 import QtWidgets, QtGui
app = QtWidgets.QApplication([])
menu = QtWidgets.QMenuBar()
files = menu.addMenu("Files")
files.addAction("hello")
files.addAction("world")
menu.showMaximized()
app.exec_()
我意识到菜单实际上是内部独立的窗口。玩了一段时间,我发现更改标志,将菜单变成没有所述窗口框架的窗口几乎可以完全解决问题。
class Menu(QtWidgets.QMenu):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
现在,菜单在单击时不会关闭(这是我想要实现的目标之一),但如果有人希望它们关闭,只需添加到构造函数的末尾即可
self.triggered.connect(self.close)
执行操作时关闭窗口(通过调用 close)
不幸的是,我不知道这是否是跨平台的或者是否具有优化含义。我邀请任何用户扩展这个答案。