如何在QMenu中隐藏子菜单

11

我有一个应用程序,其中我生成菜单项,并且我想设置特定子菜单的可见性。

我尝试使用 setVisibility(False),但这没有起作用。对于菜单项,setVisibility() 是有效的,但对于 QMenus 中的子菜单则不是。

请查看下面的代码片段:

import sys
from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.menu = QtGui.QMenu()
        self.actio1 = QtGui.QAction('One', self)
        self.actio2 = QtGui.QAction('Two', self)
        self.menu.addAction(self.actio1)
        self.menu.addAction(self.actio2)
        self.actio1.setVisible(False)
        self.submenu = QtGui.QMenu('submenu', self)
        self.submenu.addAction('sub one')
        self.submenu.addAction('sub two')
        self.menu.addMenu(self.submenu)        
        self.submenu2 = QtGui.QMenu('submenu 2', self)
        self.submenu2.addAction('sub 2 one')
        self.submenu2.addAction('sub 2 two')
        self.menu.addMenu(self.submenu2)        
        self.submenu2.setVisible(False)
        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.menu)
        self.setLayout(layout)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

在上面的例子中,我可以隐藏名为“One”的菜单项,但无法隐藏名为“submenu 2”的子菜单。

有人能给我一个想法吗...

1个回答

22

你几乎就做到了;

但你应该这样做:

self.submenu2.setVisible(False)
你需要这个:
self.submenu2.menuAction().setVisible(False)

@PBLNarasimhaRao 不用谢。 - will
2
这在C++ QT中也很好用:MySubMenu->menuAction()->setVisible(true); 最热门的谷歌搜索结果说这是不可能的,所以我想在这里分享一下。无需删除子菜单并重新添加,这可能会导致在OSX上崩溃。 - Marcus10110
2
@Marcus10110 - 是的,PyQt/PySide和Qt之间交换“.”和“->”几乎普遍适用。 - will
我使用的是OS X系统,我的菜单自动移动到了系统菜单栏。我尝试隐藏子菜单或将其标记为禁用;我尝试了MySubMenu->menuAction()->setEnabled(false);MySubMenu->menuAction()->setVisible(false);MySubMenu->menuAction()->hide();甚至是MySubMenu->menuAction()->clear();,但这些都没有改变子菜单的外观。唯一有效的方法是MyMenu->removeAction(MySubMenu->menuAction());。希望这能为其他人节省时间和挫折 :) - waldyrious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接