PyQt5:从设计文件加载菜单[重复]

Posted

技术标签:

【中文标题】PyQt5:从设计文件加载菜单[重复]【英文标题】:PyQt5: Loading menu from design file [duplicate] 【发布时间】:2021-02-24 21:39:53 【问题描述】:

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

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

菜单已经实现到设计文件

【问题讨论】:

【参考方案1】:

当使用uic 方法(或setupUi 用于pyuic 生成的文件)设置ui 时,可以从其objectName property 访问在设计器中创建的任何对象。

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

考虑到您也可以通过menuBar() 函数访问菜单栏(如果存在则返回当前菜单栏,否则创建一个新菜单栏),您可以使用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 一开始我也有类似的想法,但后来我意识到(据我所知)设计师不允许将 QMenuBar 创建为“新表单”,如果你仔细查看图像,菜单栏上方的某些内容显然不是对象检查器的标题(此外,考虑到这个问题,OP 不太可能创建 QMenuBar 表单并像 Designer 对 QMainWindows 所做的那样重命名它)。 它们不在默认元素中并不意味着.ui的顶层不能修改为使用QMenuBar,所以在我的测试中我做到了,我认为OP已经做到了也。另一方面,我很难看到图像的细节;-) @eyllanesc 有意思:修改 ui 后,Designer 是否还能正确加载为 QMenuBar 对象? 1) 尽管仔细查看状态栏与我的假设相矛盾。 2) 是的,Qt Designer 渲染器可以做到这一点,例如下面的 xml 应该允许使用 QMenuBar:<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MenuBar</class> <widget class="QMenuBar" name="MenuBar"> </widget> <resources/> <connections/> </ui>

以上是关于PyQt5:从设计文件加载菜单[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt5 中打开多个窗口时遇到问题

如何在 Pyqt5 .ui 文件中获取子菜单?

下拉“文件资源管理器”菜单是不是有 PyQt5 小部件?

PyQt5 批量删除 Excel 重复数据,多个文件自定义重复项一键删除...

通过Pyqt5 python保存文件[重复]

PyQt5数据库开发3 6 QSqlQuery完整实操案例图文详解