勇哥注:
Qt Widgets Designer是类似C#编辑form窗体的编辑器,可以拖放控件的方式编辑界面。
然后就是python端怎么使用这个界面了。
(一)查找Qt Widgets Designer的安装位置
使用下面脚本:
import os
import sys
def find_pyside6_installation():
"""
查找PySide6的安装位置
"""
try:
# 尝试导入PySide6
import PySide6
# 获取PySide6模块的文件路径
pyside6_path = os.path.dirname(PySide6.__file__)
# 获取PySide6版本
pyside6_version = PySide6.__version__
# 打印详细信息
print("✅ PySide6安装信息:")
print(f" 版本: {pyside6_version}")
print(f" 安装路径: {pyside6_path}")
# 检查Qt Designer是否存在
designer_path = os.path.join(pyside6_path, 'designer.exe')
if os.path.exists(designer_path):
print(f"\n✅ Qt Designer已找到:")
print(f" 位置: {designer_path}")
else:
print("\n❌ Qt Designer未找到,可能在其他位置或未包含在当前版本中")
# 检查其他重要组件
print("\n? 检查重要组件:")
# 检查Qt目录
qt_dir = os.path.join(pyside6_path, 'Qt')
if os.path.exists(qt_dir):
print(f" ✅ Qt目录: {qt_dir}")
# 检查常用模块
common_modules = ['QtCore', 'QtGui', 'QtWidgets', 'QtNetwork']
for module_name in common_modules:
module_path = os.path.join(pyside6_path, f'{module_name}.pyd')
if os.path.exists(module_path):
print(f" ✅ {module_name} 模块已找到")
return True
except ImportError:
print("❌ 错误: PySide6未安装!")
print("\n? 安装建议:")
print(" 1. 使用pip安装: pip install PySide6")
print(" 2. 使用清华源安装: pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple")
# 检查是否有pip
try:
import pip
print(f" 当前Python解释器: {sys.executable}")
except ImportError:
print(" 无法检测pip,请确保Python环境正确配置")
return False
except Exception as e:
print(f"❌ 发生未知错误: {str(e)}")
return False
if __name__ == "__main__":
print("? 正在查找PySide6安装位置...\n")
success = find_pyside6_installation()
print("\n? 总结:")
if success:
print(" PySide6已成功安装并找到位置")
else:
print(" 请安装PySide6后再次运行此脚本")
# 在Windows上按任意键继续
if sys.platform == 'win32':
print("\n按任意键关闭窗口...")
import msvcrt
msvcrt.getch()返回结果:
? 正在查找PySide6安装位置...
✅ PySide6安装信息:
版本: 6.10.0
安装路径: C:\Python313\Lib\site-packages\PySide6
✅ Qt Designer已找到:
位置: C:\Python313\Lib\site-packages\PySide6\designer.exe
? 检查重要组件:
✅ QtCore 模块已找到
✅ QtGui 模块已找到
✅ QtWidgets 模块已找到
✅ QtNetwork 模块已找到
? 总结:
PySide6已成功安装并找到位置
根据结果,创建桌面快捷方式,方便以后使用。
(二)创建向导

这里说下向导中几种窗口类型:
(1)Dialog xxxx
(2)Main Window
(3)Widget
其中,Main Window是带有状态条、菜单栏、工具条的标准windows窗口。
Widget是基础窗口,但是它与Dialog还是有区别,如下:
主要区别
1. 1. 用途和交互模式
- Dialog (对话框) : 主要用于短期任务和与用户的简短交互,通常作为模态窗口(会阻塞父窗口操作),适合需要用户输入或确认的场景
- Widget (窗口部件) : 是基础UI元素,更通用,可以作为独立窗口或嵌入到其他窗口中,适合构建主要界面或可复用组件
2. 2. 生命周期管理
- Dialog : 通常使用 exec() 方法运行自己的事件循环,不会出现"一闪而过"的问题
- Widget : 如果作为局部变量且只用 show() 方法,函数执行完毕后会被销毁,导致窗口消失
3. 3. 功能特性
- Dialog : 支持返回值、默认按钮配置和右下角大小调整手柄
- Widget : 更基础,没有这些特定于对话框的功能
4. 4. 窗口层次结构
- Dialog : 即使设置了父窗口,也始终作为顶级窗口,但默认位置会显示在父窗口中央
- Widget : 根据创建方式可以是顶级窗口或子窗口部件
实际使用建议
- 需要用户输入信息、确认操作时,使用 Dialog
- 构建应用程序主界面或复杂组件时,使用 Widget
- 对于Widget窗口,如果希望它稳定显示,需要正确管理其生命周期(如创建为成员变量或使用 setAttribute(Qt::WA_DeleteOnClose) )
(三)由界面文件生成py文件

敲入指令生成py文件:
pyside6-uic input_file.ui -o output_file.py

(四)应用界面文件
应用生成的output_file.py界面文件。
(4.1)方式一:把demo1.py这个界面放到QMainWindow的central widge里面去。
具体实现方式是:
1. 首先创建了一个QWidget作为QMainWindow的中心部件:
self.central_widget = QWidget() 和 self.setCentralWidget(self.central_widget)
2. 然后实例化了demo1.py中的Ui_Form类: self.ui = Ui_Form()
3. 最后将UI设置到中心部件上: self.ui.setupUi(self.central_widget)
这种方式是PySide6/PyQt中常用的UI集成模式,它结合了Qt Designer设计的界面(通过uic工具转换为Python代码)
和自定义的QMainWindow类,既保留了Qt Designer可视化设计的便利性,
又能在Python代码中添加自定义的逻辑和功能。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QMessageBox
from demo1 import Ui_Form
class SimpleWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建一个QWidget作为中心部件
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
# 创建UI对象并设置到中心部件
self.ui = Ui_Form()
self.ui.setupUi(self.central_widget)
# 设置窗口标题
self.setWindowTitle("PySide6测试窗口 - 使用demo1界面")
# 绑定btnOK按钮的点击事件
self.ui.btnOK.clicked.connect(self.show_message)
# 设置窗口大小为demo1.ui中设计的尺寸
self.resize(346, 202)
def show_message(self):
"""显示一个弹窗信息"""
QMessageBox.information(self, "提示", "按钮被点击了!这是一个测试弹窗信息。")
if __name__ == "__main__":
# 创建应用程序实例
app = QApplication(sys.argv)
# 创建窗口实例
window = SimpleWindow()
window.show()
# 运行应用程序的主循环
sys.exit(app.exec())(4.2)方式二:直接继承UI类
这种实现方式也是PyQt/PySide中常用的UI集成模式,它结合了Qt Designer生成的UI和自定义的窗口类,
使代码更加简洁直观,避免了额外的UI对象层次。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox
from demo1 import Ui_Form
class SimpleWindow(QMainWindow, Ui_Form):
def __init__(self):
super().__init__()
# 直接调用setupUi方法设置UI
self.setupUi(self)
# 设置窗口标题
self.setWindowTitle("PySide6测试窗口 - 直接继承UI类")
# 绑定btnOK按钮的点击事件
self.btnOK.clicked.connect(self.show_message)
# 设置窗口大小为demo1.ui中设计的尺寸
self.resize(346, 202)
def show_message(self):
"""显示一个弹窗信息"""
QMessageBox.information(self, "提示", "按钮被点击了!这是一个测试弹窗信息。")
if __name__ == "__main__":
# 创建应用程序实例
app = QApplication(sys.argv)
# 创建窗口实例
window = SimpleWindow()
window.show()
# 运行应用程序的主循环
sys.exit(app.exec())(4.3)方式三:使用QWidget作为主窗口
使用QWidget作为主窗口是一种更轻量级的实现方式,适合不需要菜单栏、
工具栏和状态栏等QMainWindow特有功能的简单应用程序。
这种方式更符合demo1.ui的原始设计意图,因为从demo1.py可以看出,Ui_Form是为QWidget设计的。
import sys
from PySide6.QtWidgets import QApplication, QWidget, QMessageBox
from demo1 import Ui_Form
class SimpleWindow(QWidget, Ui_Form):
def __init__(self):
super().__init__()
# 直接调用setupUi方法设置UI
self.setupUi(self)
# 设置窗口标题
self.setWindowTitle("PySide6测试窗口 - 使用QWidget作为主窗口")
# 绑定btnOK按钮的点击事件
self.btnOK.clicked.connect(self.show_message)
# 设置窗口大小为demo1.ui中设计的尺寸
#self.resize(346, 202)
def show_message(self):
"""显示一个弹窗信息"""
QMessageBox.information(self, "提示", "按钮被点击了!这是一个测试弹窗信息。")
if __name__ == "__main__":
# 创建应用程序实例
app = QApplication(sys.argv)
# 创建窗口实例
window = SimpleWindow()
window.show()
# 运行应用程序的主循环
sys.exit(app.exec())(4.4)方式四:动态加载UI文件
动态加载带来了无需重新生成Python代码的便利性,特别适合UI频繁变动的开发阶段。
import sys
from PySide6.QtWidgets import QApplication, QWidget, QMessageBox
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile
class SimpleWindow(QWidget):
def __init__(self):
super().__init__()
# 使用QUiLoader动态加载UI文件
loader = QUiLoader()
ui_file = QFile("demo1.ui")
ui_file.open(QFile.ReadOnly)
self.ui = loader.load(ui_file, self)
ui_file.close()
# 设置窗口标题
self.setWindowTitle("PySide6测试窗口 - 动态加载UI文件")
# 绑定btnOK按钮的点击事件
self.ui.btnOK.clicked.connect(self.show_message)
# 调整窗口大小以适应UI内容
self.resize(self.ui.size())
def show_message(self):
"""显示一个弹窗信息"""
QMessageBox.information(self, "提示", "按钮被点击了!这是一个测试弹窗信息。")
if __name__ == "__main__":
# 创建应用程序实例
app = QApplication(sys.argv)
# 创建窗口实例
window = SimpleWindow()
window.show()
# 运行应用程序的主循环
sys.exit(app.exec())这种方式也有其问题,如下:
在使用QUiLoader动态加载UI文件的方式下,IDE无法为 self.ui.btnOK 中的 btnOK 提供语法补全功能。
这是因为:
1. 1. 类型信息缺失 :当使用动态加载时, self.ui 的类型在编译时(或IDE分析时)是未知的,
IDE无法确定它包含哪些属性和方法。
2. 2. 动态特性限制 :Python是动态类型语言,而UI元素是在运行时通过 loader.load() 方法动态创建的,
IDE无法在静态分析阶段知道这些元素的存在。
3. 3. 对比静态加载方式 :当使用 from demo1 import Ui_Form 并继承该类时,
IDE可以通过分析生成的Python代码,知道 btnOK 等UI元素的存在,从而提供语法补全。
4. 4. 优缺点权衡 :动态加载虽然牺牲了IDE的自动补全支持,但带来了无需重新生成Python代码的便利性,
特别适合UI频繁变动的开发阶段。
5. 5. 可能的解决方案 :一些高级IDE或插件可能提供有限的支持,但通常需要额外配置或使用类型提示(type hints)
来帮助IDE理解动态创建的对象结构。

(4.5)方式五:
多重继承与委托模式结合 复杂应用中可能结合多种模式,例如使用一个单独的控制器类来处理业务逻辑,而UI类只负责界面展示。
每种方式都有其适用场景,可以根据项目需求、团队习惯和代码维护性等因素选择合适的集成方式