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设置为