Pyqt 阻止将工具栏添加到关联菜单

Pyqt 阻止将工具栏添加到关联菜单,pyqt,pyside,Pyqt,Pyside,我正在创建一个自定义工具栏,它在初始化时自动将自己添加到父级(如果存在) 我希望此自定义工具栏不显示在关联菜单中。但是,尽管使用了setContextMenuPolicy,但仍显示了与工具栏相关的内容(我不知道是什么): 我不知道上下文菜单项是什么。我的理解是,通过上下文菜单策略,任何小部件都可以添加到上下文菜单中。然而,CustomToolBar中没有任何其他小部件 解决方法是在主窗口上完全禁用关联菜单,并创建一个切换可见性的菜单项(例如视图) 导入系统 导入时间 从PyQt5导入QtCor

我正在创建一个自定义工具栏,它在初始化时自动将自己添加到父级(如果存在)

我希望此自定义工具栏不显示在关联菜单中。但是,尽管使用了
setContextMenuPolicy
,但仍显示了与工具栏相关的内容(我不知道是什么):

我不知道上下文菜单项是什么。我的理解是,通过上下文菜单策略,任何小部件都可以添加到上下文菜单中。然而,CustomToolBar中没有任何其他小部件

解决方法是在主窗口上完全禁用关联菜单,并创建一个切换可见性的菜单项(例如视图)

导入系统 导入时间 从PyQt5导入QtCore、QtWidgets 类CustomToolBar(QtWidgets.QToolBar): def uuu init uuu(self,parent=None): super()。\uuuuu init\uuuuuu(父=父) 如果是家长: self.setParent(父级) self.parent().addToolBar(QtCore.Qt.BottomToolBarArea,self) self.setObjectName('自定义工具栏') self.setContextMenuPolicy(QtCore.Qt.NoContextMenu) 类MainWindow(QtWidgets.QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.counter=0 自我调整大小(250,75) self.init_widgets() self.init_布局() def init_小部件(自): self.exit_action=qtwidkets.QAction('&exit',self) self.exit_action.setShortcut('Ctrl+Q') self.exit\u action.setToolTip('退出应用程序') self.exit\u action.triggered.connect(self.close) self.menu=self.menuBar() self.menu_file=self.menu.addMenu(“&file”) self.menu\u file.addAction(self.exit\u操作) #将parent设置为self将在主窗口中嵌入自定义工具栏 self.status=自定义工具栏(self) def初始布局(自): layout=qtwidts.QVBoxLayout() centralWidget=QtWidgets.QWidget() centralWidget.setLayout(布局) self.setCentralWidget(centralWidget) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=qtwidts.QApplication(sys.argv) 主窗口=主窗口() 主窗口。显示() sys.exit(app.exec_())
注意:如果单击菜单栏或下部工具栏,图像显示不正确

一些小部件不重写contextMenuEvent方法,因此使用
self.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
将不起作用,QToolBar(以及QMenuBar)就是这种情况。在这些情况下,必须重写并拒绝事件方法

假设您只是不希望它出现在QToolBar中,则只需使用:

class CustomToolBar(qtwidts.QToolBar):
def uuu init uuu(self,parent=None):
super()。\uuuuu init\uuuuuu(父=父)
如果isinstance(父项,qtwidts.QMainWindow):
self.setParent(父级)
parent.addToolBar(QtCore.Qt.BottomToolBarArea,self)
self.setObjectName('自定义工具栏')
def事件(自身、事件):
如果event.type()==QtCore.QEvent.ContextMenu:
返回真值
返回super().event(事件)
如果还希望对菜单栏执行相同的操作,则必须实现类似的逻辑:

类状态栏(qtwidts.QMenuBar):
def事件(自身、事件):
如果event.type()==QtCore.QEvent.ContextMenu:
返回真值
返回super().event(事件)
最后,建议使用指示小部件类型的名称,因此我将菜单更改为菜单栏:

def init_小部件(自):
self.exit_action=qtwidkets.QAction('&exit',self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit\u action.setToolTip('退出应用程序')
self.exit\u action.triggered.connect(self.close)
self.menu_bar=StatusBar()
self.setMenuBar(self.menu栏)
self.menu\u file=self.menu\u bar.addMenu(“&file”)
self.menu\u file.addAction(self.exit\u操作)
#将parent设置为self将在主窗口中嵌入自定义工具栏
self.tool\u bar=自定义工具栏(self)
更新:

OP的目标似乎是不显示与QMainWindow的QMenu中实现的QToolBar相关的QAction,因此,最好覆盖createPopupMenu方法并删除QAction,而无需实现自定义QToolBar

导入系统 导入uuid 从PyQt5导入QtCore、QtWidgets 类MainWindow(QtWidgets.QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.init_widgets() self.init_布局() def init_小部件(自): self.exit_action=qtwidts.QAction(“&exit”,self) self.exit_action.setShortcut(“Ctrl+Q”) self.exit\u action.setToolTip(“退出应用程序”) self.exit\u action.triggered.connect(self.close) self.menu\u bar=self.menuBar() self.menu\u file=self.menu\u bar.addMenu(“&file”) self.menu\u file.addAction(self.exit\u操作) self.custom_toolbar=qtwidts.QToolBar() self.addToolBar(QtCore.Qt.bottomtoolbarea,self.custom_工具栏) self.custom\u toolbar.setProperty(“隐藏\u操作\u工具栏”,True) self.dock=qtwidts.QDockWidget(“dock”) self.addDockWidget(QtCore.Qt.TopDockWidgetArea,self.dock) def初始布局(自): layout=qtwidts.QVBoxLayout() centralWidget=QtWidgets.QWidget() centralWidget.setLayout(布局) self.setCentralWidget(centralWidget) def createPopupMenu(自): 标题=[] 对于self.findChildren(QtWidgets.QToolBar)中的工具栏: 如果toolbar.property(“hide\u action\u toolbar”)为无: 持续 if toolbar.property(“隐藏工具栏动作”): toolbar.setProperty(“最后一个窗口标题”,toolbar.windowTitle()) toolbar.setWindowTitle(uuid.uuid4().hex) titles.append(toolbar.windowTitle()) 其他: 工具栏。将WindowTitle设置为