直接编辑ui_*.py文件无效,因uic仅单向生成;所有界面修改必须在.ui文件中进行,再重新生成Python代码。
Qt Designer 里改 ui_*.py 文件没用?
直接编辑生成的 ui_*.py 文件,下次用 qt designer 保存就会被覆盖。这不是 bug,是设计使然——uic 工具只负责“单向生成”,不维护双向同步。
正确路径只有一条:所有结构修改必须回到 .ui 文件本身,再重新生成 Python 代码。
- 用 Qt Designer 打开原始
main_window.ui(不是ui_main_window.py) - 拖拽控件、调整布局、改
objectName或layout属性 - 保存后,用命令行重新生成:
python -m PyQt6.uic pyuic6 -x main_window.ui -o ui_main_window.py - 如果项目用了 CMake 或 pyproject.toml,确认构建流程里调用的是
pyuic6而非旧版pyuic5
PySide6 / PyQt6 中 setupUi() 调用后还能改视图结构吗?
能,但得在 setupUi() 之后、show() 之前操作,且只能用代码补全或微调,不能推翻 Designer 布局逻辑。
比如想把某个 QLabel 换成 QLineEdit,不能删掉原控件再 new 一个——它已绑定到 self.label_name,强行替换会导致引用失效或布局错乱。
- 推荐做法:在 Designer 里先把控件设为
QLabel,勾选objectName(如input_field),生成后在 Python 里用self.input_field.setParent(None)移除,再插入新控件 - 更安全的做法:用
QStackedWidget或QVBoxLayout预留容器,在代码里动态addWidget() - 注意:用
setParent(None)后需手动管理生命周期,否则可能内存泄漏
改了 .ui 文件但运行时界面没变?
大概率是缓存或导入路径问题,不是代码写错了。
- 检查 Python 是否 import 的是旧版
ui_*.py(比如你改了dialog.ui,但主程序仍 importui_dialog_old) - PyCharm/VSCode 可能缓存了编译后的
.pyc,删掉__pycache__目录再试 - 终端运行时确认当前工作目录是否和
.ui文件路径一致——uic默认按相对路径加载资源,路径错会导致图标、qss 不生效 - 如果用了
QFile加载 qss,注意load()返回布尔值,失败也不报错,建议加if not f.open(...): print("qss load failed")
Designer 里看不到自定义控件?
Qt Designer 默认只认 Qt 自带控件和明确注册的插件,不会自动发现你写的 MyButton 类。
要让它出现在控件栏并可拖拽,必须写插件并安装到 Designer 插件路径,过程繁琐且版本敏感;日常开发中更实际的做法是:在 .ui 里放一个 QWidget 占位,设好 objectName 和尺寸策略,然后在 Python 里 self.my_widget = MyButton(self); self.my_widget.setParent(self.placeholder)。
- 占位控件的
layout必须为空,否则setParent()后尺寸会被压缩 - 记得调用
self.my_widget.move()或self.my_widget.resize(),因为setParent()不继承 layout 约束 - PySide6 从 6.5 开始支持
QUiLoader.registerCustomWidget(),但仅限运行时加载,Designer 编辑期依然不可见
.ui 文件和它生成的绑定逻辑里,而不是你在 Python 里写了多少行 setXXX()。越想绕过 Designer 直接硬编码结构,后期维护成本越高。

















