Python PyQt5:从设计文件加载菜单

Python PyQt5:从设计文件加载菜单,python,pyqt5,qt-designer,Python,Pyqt5,Qt Designer,我正在尝试加载主程序窗口的设计文件。如何访问菜单栏、菜单(和子菜单)并设置操作 class MainWindow(QtWidgets.QMainWindow): def __init__(self, design_file='Lab1_Main.ui'): super().__init__() uic.loadUi(design_file, self) 菜单已实现为设计文件 当使用uic方法设置ui时(或者对于pyuic生成的文件,setupUi),在d

我正在尝试加载主程序窗口的设计文件。如何访问菜单栏、菜单(和子菜单)并设置操作

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, design_file='Lab1_Main.ui'):
        super().__init__()
        uic.loadUi(design_file, self)
菜单已实现为设计文件


当使用
uic
方法设置ui时(或者对于pyuic生成的文件,
setupUi
),在designer中创建的任何对象都可以从its访问

在您的情况下,可以从
self.ToolsMenu
访问第一个菜单,其第一个操作是
self.ChangePassword
,等等

考虑到您也可以从函数访问菜单栏(如果当前菜单栏存在,将返回当前菜单栏,否则将创建一个新菜单栏),并且您可以使用
actions()
像任何QWidget一样循环浏览其内容:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, design_file='Lab1_Main.ui'):
        super().__init__()
        uic.loadUi(design_file, self)
        self.printActions(self.menuBar())

    def printActions(self, obj, indent=0):
        for action in obj.actions():
            if action.isSeparator() and not action.text():
                print('\t' * indent + '[separator]')
            else:
                print('\t' * indent + action.text())
                if action.menu():
                    self.printActions(action.menu(), indent + 1)

建议:避免使用大写的对象名称;通常(不仅仅是Python)只对类和常量使用大写名称,由于这种做法提高了可读性,因为它更容易区分类/常量和函数/变量。

该图像让我感到困惑,因为我认为.ui将QMenuBar作为顶级,而OP希望将QMenuBar放在QMainWindow@eyllanesc一开始我也有类似的想法,但后来我意识到(据我所知),Designer不允许将QMenuBar创建为“新表单”,如果仔细观察图像,菜单栏上方的某些内容显然不是object inspector的标题(另外,考虑到这个问题,OP不太可能创建一个QMenuBar表单,并将其重命名,就像Designer对QMainWindows所做的那样)。它们不在默认元素中并不意味着不能修改.ui的顶层以使用QMenuBar,所以在我的测试中我做了,我认为OP也做了。另一方面,我很难看到图像的细节;-)@eyllansc这很有趣:在修改ui之后,设计器是否仍然能够将其作为QMenuBar对象正确加载?1)尽管仔细查看状态栏与我的假设相矛盾。2) 是的,Qt Designer呈现程序可以做到这一点,例如,以下xml应该允许使用QMenuBar:
MenuBar