PyQt5中如何以更简洁的方式将QWidget嵌入QMainWindow
问题
我正在摸索提升PyQt5 UI开发效率的方法,想了解除了下述代码的实现方式外,是否存在更简洁的写法来完成QWidget在QMainWindow中的设置:
class PayrollMainWindow(QtWidgets.QMainWindow): def __init__(self): super(PayrollMainWindow, self).__init__() PayrollWidget = self.Payroll() self.setWindowTitle("PSA Payroll") self.setCentralWidget(PayrollWidget) self.menuBar = self.menuBar() fileMenu = self.menuBar.addMenu('File') editMenu = self.menuBar.addMenu('Edit') class Payroll(QtWidgets.QWidgets):...
优化写法
首先修正原代码的两处问题:
- 嵌套类
Payroll继承的QtWidgets.QWidgets是笔误,正确基类为QtWidgets.QWidget - 不建议将自定义业务组件写成主窗口的内部嵌套类,单独拆分定义可读性、复用性更高
优化后的精简实现如下:
from PyQt5 import QtWidgets class Payroll(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) # 此处编写薪资组件自身的UI布局、业务逻辑 class PayrollMainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PSA Payroll") # 若后续需要操作中心控件,可赋值给self.payroll_widget属性 self.setCentralWidget(Payroll(self)) # 菜单栏无需额外赋值覆盖类自带属性,直接调用创建即可 self.menuBar().addMenu('File') self.menuBar().addMenu('Edit')
进一步精简的可选写法
如果菜单项较多,不需要单独持有每个菜单的引用时,可以用迭代的方式批量创建,减少重复代码:
class PayrollMainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PSA Payroll") self.setCentralWidget(Payroll(self)) # 批量添加菜单 for menu_name in ('File', 'Edit', 'View', 'Help'): self.menuBar().addMenu(menu_name)
效率提升建议
- Python3环境下直接用
super().__init__()即可,不需要写旧版带类名和self参数的super调用,写法更简洁 - 如果UI复杂度较高,直接用Qt Designer拖拽设计界面,通过
pyuic5命令转成Python代码,或者用uic.loadUi()直接加载ui文件,能省去大量手写布局的代码 - 不要为了过度精简省略实例属性赋值:如果后续需要绑定菜单事件、操作中心控件内的元素,一定要把对应对象存为
self的实例属性,避免后续重新查找控件增加额外代码。
内容的提问来源于stack exchange,提问作者Jansen Lloyd Macabangun
相关产品推荐
相关产品推荐

