以编程方式从QMenubar中删除顶级QMenu

时间:2015-12-17 00:01:22

标签: python pyqt qmenu

我正在开发一个使用Qt Designer构建界面的Python项目。在构建插件功能时,我能够允许动态加载用户插件并创建一个新的QMenu项添加到主菜单栏。问题是,一旦添加到主菜单栏,似乎无法删除顶级QMenu。我在这个主题上进行了相当多的研究和搜索,似乎与此主题相关的每个解决方案都是通过删除其动作来移除QMenu中的子菜单项,而不是来删除它动态添加QMenu本身。我希望有人会指出这是一个简单的事情,并提供一个代码片段来演示如何完成。

2 个答案:

答案 0 :(得分:0)

希望这会让你了解你的想法。我从另一个帖子中获取了一些内容,这是同样的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_()

答案 1 :(得分:0)

Achayan的解决方案崩溃在python2 qt4(Windows)上进行删除

更好的方法是使用clear函数。

添加上述解决方案,

def removeMenu():
    self.main_menu.clear()