以编程方式从 QMenubar 中删除顶级 QMenu
Remove top level QMenu from QMenubar programmatically
我正在开发一个使用 Qt Designer 构建界面的 Python 项目。在构建插件功能时,我能够允许动态加载用户插件并创建一个新的 QMenu
项目以添加到主菜单栏。问题是,一旦将顶层 QMenu
添加到主菜单栏,似乎就无法将其删除。我 researched/searched 对这个主题有很多了解,似乎与该主题相关的每个解决方案都是通过删除其操作来从 QMenu
中删除子菜单项, 而不是 用于删除动态添加的 QMenu
本身。我希望有人指出这是一件简单的事情,并提供一个代码片段来演示这是如何完成的。
希望这能让您对自己的工作有所了解。我从另一个 post 中获取了一部分,这与 qmenu 相同
import sys
# This is bad, but Iam lazy
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.main_menu = self.menuBar()
widget = QWidget()
self.menuList = []
layout2 = QVBoxLayout(widget)
self.menuButton = QPushButton("Add Menu")
self.menuRmButton = QPushButton("Remove Menu")
layout2.addWidget(self.menuButton)
layout2.addWidget(self.menuRmButton)
self.menuButton.clicked.connect(self.create_menu)
self.menuRmButton.clicked.connect(self.removeMenu)
self.setCentralWidget(widget)
def create_menu(self):
menu2 = self.main_menu.addMenu('Menu 1')
self.menuList.append(menu2)
Action1=QAction('Menu 1 0',self)
Action1.triggered.connect(self.action_1)
menu2.addAction(Action1)
Action2=QAction('Menu 1 1',self)
Action2.triggered.connect(self.action_2)
menu2.addAction(Action2)
def removeMenu(self):
if self.menuList:
for eachMenu in self.menuList:
menuAct = eachMenu.menuAction()
self.main_menu.removeAction(menuAct)
# just for safe side
menuAct.deleteLater()
eachMenu.deleteLater()
def action_1(self):
print('Menu 1 0')
def action_2(self):
print('Menu 1 1')
if __name__ == '__main__':
app=QApplication(sys.argv)
new=MyWindow()
new.show()
app.exec_()
上面 Achayan 的解决方案在 python2 qt4 (Windows) 上因删除
而崩溃
更好的方法是使用清除功能。
添加到上面的解决方案中,
def removeMenu():
self.main_menu.clear()
我正在开发一个使用 Qt Designer 构建界面的 Python 项目。在构建插件功能时,我能够允许动态加载用户插件并创建一个新的 QMenu
项目以添加到主菜单栏。问题是,一旦将顶层 QMenu
添加到主菜单栏,似乎就无法将其删除。我 researched/searched 对这个主题有很多了解,似乎与该主题相关的每个解决方案都是通过删除其操作来从 QMenu
中删除子菜单项, 而不是 用于删除动态添加的 QMenu
本身。我希望有人指出这是一件简单的事情,并提供一个代码片段来演示这是如何完成的。
希望这能让您对自己的工作有所了解。我从另一个 post 中获取了一部分,这与 qmenu 相同
import sys
# This is bad, but Iam lazy
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.main_menu = self.menuBar()
widget = QWidget()
self.menuList = []
layout2 = QVBoxLayout(widget)
self.menuButton = QPushButton("Add Menu")
self.menuRmButton = QPushButton("Remove Menu")
layout2.addWidget(self.menuButton)
layout2.addWidget(self.menuRmButton)
self.menuButton.clicked.connect(self.create_menu)
self.menuRmButton.clicked.connect(self.removeMenu)
self.setCentralWidget(widget)
def create_menu(self):
menu2 = self.main_menu.addMenu('Menu 1')
self.menuList.append(menu2)
Action1=QAction('Menu 1 0',self)
Action1.triggered.connect(self.action_1)
menu2.addAction(Action1)
Action2=QAction('Menu 1 1',self)
Action2.triggered.connect(self.action_2)
menu2.addAction(Action2)
def removeMenu(self):
if self.menuList:
for eachMenu in self.menuList:
menuAct = eachMenu.menuAction()
self.main_menu.removeAction(menuAct)
# just for safe side
menuAct.deleteLater()
eachMenu.deleteLater()
def action_1(self):
print('Menu 1 0')
def action_2(self):
print('Menu 1 1')
if __name__ == '__main__':
app=QApplication(sys.argv)
new=MyWindow()
new.show()
app.exec_()
上面 Achayan 的解决方案在 python2 qt4 (Windows) 上因删除
而崩溃更好的方法是使用清除功能。
添加到上面的解决方案中,
def removeMenu():
self.main_menu.clear()