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:从设计文件加载菜单[重复]的主要内容,如果未能解决你的问题,请参考以下文章