PySide6 + Qt Designer + PyCharm 完整开发流程

作者:资深流水灯工程师日期:2026/6/10

PyCharm 对 Python 桌面开发有更完善的支持,包括智能代码补全、断点调试、集成终端、版本控制等功能,结合 Qt Designer 的可视化 UI 设计,是工业级上位机开发的首选组合。以下是完全适配 PyCharm 的标准化开发流程。

一、环境准备与 PyCharm 配置

1. 创建项目并配置虚拟环境(必做)

PyCharm 强烈推荐使用虚拟环境隔离项目依赖,避免版本冲突:

  1. 打开 PyCharm → 新建项目 (New Project)
  2. 选择项目位置,命名为test_equipment_app(示例)
  3. 勾选 "New environment using Virtualenv",保持默认 Python 解释器
  4. 取消勾选 "Create a main.py welcome script"
  5. 点击 "Create" 完成项目创建

2. 安装 PySide6 核心依赖

在 PyCharm 底部的Terminal终端中执行:

1# 安装指定稳定版本(推荐6.7.2,与STM32上位机兼容性最好)
2pip install pyside6==6.7.2
3
4# 验证安装(终端执行)
5python -c "import PySide6; print(f'PySide6版本: {PySide6.__version__}')"

3. 配置 PyCharm 外部工具(核心步骤)

这是 PyCharm 与 Qt Designer 联动的关键,配置后可一键打开设计器、转换 UI / 资源文件:

步骤 1:打开外部工具配置界面
  • 菜单栏:File → Settings → Tools → External Tools
  • 点击左上角+号,依次添加以下 3 个工具
步骤 2:添加 Qt Designer 工具
配置项说明
NameQt Designer工具显示名称
Programpyside6-designer系统自动识别的命令
Arguments$FilePath$直接打开当前选中的.ui 文件
Working directory$FileDir$工作目录为文件所在目录
Advanced Options取消勾选 "Synchronize files after execution"避免不必要的文件同步
步骤 3:添加 UI 转 Python 工具
配置项
NameUI 转 Python
Programpyside6-uic
Arguments$FileName$ -o $FileNameWithoutExtension$_ui.py --from-imports
Working directory$FileDir$
步骤 4:添加资源转 Python 工具
配置项
Name资源转 Python
Programpyside6-rcc
Arguments$FileName$ -o $FileNameWithoutExtension$_rc.py
Working directory$FileDir$
配置完成验证

右键点击项目中任意位置 → 选择External Tools,能看到刚才添加的 3 个工具即配置成功。

4. 安装 PyCharm 增强插件(推荐)

  • PySide6 Plugin:提供 UI 文件预览、信号槽导航、QSS 语法高亮
  • .ignore:自动生成.gitignore 文件,排除__pycache__、dist 等目录
  • Rainbow Brackets:彩虹括号,提升代码可读性

二、PyCharm 专属项目结构(最佳实践)

创建以下目录结构,并右键点击根目录 → Mark Directory as → Sources Root(解决导入红色波浪线问题):

1test_equipment_app/
2├── main.py                # 程序唯一入口
3├── ui/                    # 自动生成的UI代码(禁止手动修改)
4   ├── main_window.ui     # Qt Designer设计文件
5   ├── main_window_ui.py  # uic转换后的Python代码
6   ├── setting_dialog.ui
7   └── setting_dialog_ui.py
8├── views/                 # UI逻辑层(信号槽绑定、界面交互)
9   ├── main_window.py     # 主窗口逻辑类
10   └── setting_dialog.py  # 设置对话框逻辑类
11├── core/                  # 核心业务逻辑(纯Python,无UI依赖)
12   ├── serial_port.py     # 串口通信(STM32/FPGA)
13   ├── data_processor.py  # 测试数据处理
14   └── test_case.py       # 测试用例执行
15├── resources/             # 资源文件
16   ├── icons/             # 按钮图标、窗口图标
17   ├── qss/               # 样式表文件
18   └── resources.qrc      # Qt资源清单
19├── config/                # 配置文件
20   └── app_config.ini     # 串口参数、测试参数
21├── tests/                 # 单元测试
22├── requirements.txt       # 依赖清单
23└── .gitignore             # Git忽略文件

三、Qt Designer UI 设计流程(PyCharm 集成)

1. 快速启动 Qt Designer

在 PyCharm 中右键点击ui/目录 → External Tools → Qt Designer,直接在该目录下创建 UI 文件。

2. 核心设计规范(针对测试设备上位机)

  1. 选择正确的窗口模板
    • 主窗口:Main Window(带菜单栏、工具栏、状态栏,适合主界面)
    • 参数设置:Dialog with Buttons Right(带确定 / 取消按钮)
    • 自定义控件:Widget(如串口配置面板、数据显示面板)
  2. 控件命名规范(强制): 后续代码通过objectName访问控件,必须统一命名:
控件类型前缀示例
QPushButtonbtn_btn_connect_serial、btn_start_test
QLineEdittxt_txt_serial_port、txt_baud_rate
QComboBoxcbx_cbx_baud_rate、cbx_parity
QLabellbl_lbl_status、lbl_test_result
QTableWidgettbl_tbl_test_data
QCheckBoxchk_chk_auto_save
  1. 布局管理(关键)
    • 绝对禁止使用拖拽定位(窗口缩放必错位)
    • 优先使用QVBoxLayout(垂直)和QHBoxLayout(水平)
    • 复杂界面使用QGridLayout(网格)
    • 最后点击主窗口空白处 → 右键 → 布局 → 选择整体布局
    • 通过Layout属性调整间距 (margin) 和边距 (spacing)
  2. 保存 UI 文件:保存到ui/目录,命名为main_window.ui

四、UI 文件转换与代码集成

1. 一键转换 UI 文件

在 PyCharm 中右键点击ui/main_window.uiExternal Tools → UI转Python,自动生成main_window_ui.py

重要提醒

  • 绝对不要手动修改_ui.py文件,每次 UI 修改后重新转换即可
  • 转换时自动添加的--from-imports参数会生成相对导入,避免路径问题

2. 创建视图逻辑类(UI 与逻辑分离)

views/目录下创建main_window.py,继承自 Qt 基类和自动生成的 UI 类:

1from PySide6.QtWidgets import QMainWindow, QMessageBox
2from PySide6.QtCore import Qt
3from ui.main_window_ui import Ui_MainWindow
4from core.serial_port import SerialPortManager
5
6class MainWindow(QMainWindow, Ui_MainWindow):
7    def __init__(self):
8        super().__init__()
9        # 初始化UI(自动创建所有控件)
10        self.setupUi(self)
11        # 设置窗口标题和大小
12        self.setWindowTitle("芯片测试设备上位机")
13        self.resize(1200, 800)
14        # 初始化业务逻辑对象
15        self.serial_manager = SerialPortManager()
16        # 绑定所有信号与槽
17        self._connect_signals()
18        # 初始化界面数据
19        self._init_ui()
20
21    def _connect_signals(self):
22        """统一管理所有信号槽绑定"""
23        # 串口连接按钮
24        self.btn_connect_serial.clicked.connect(self.on_connect_serial_clicked)
25        # 开始测试按钮
26        self.btn_start_test.clicked.connect(self.on_start_test_clicked)
27        # 串口接收数据信号(自定义信号)
28        self.serial_manager.data_received.connect(self.on_serial_data_received)
29
30    def _init_ui(self):
31        """初始化界面显示"""
32        # 初始化串口波特率下拉框
33        self.cbx_baud_rate.addItems(["9600", "19200", "38400", "115200", "921600"])
34        self.cbx_baud_rate.setCurrentText("115200")
35        # 状态栏显示
36        self.statusBar().showMessage("设备未连接")
37        # 默认禁用测试按钮
38        self.btn_start_test.setEnabled(False)
39
40    # ------------------------------ 槽函数 ------------------------------
41    def on_connect_serial_clicked(self):
42        """串口连接按钮点击事件"""
43        port = self.txt_serial_port.text().strip()
44        baud_rate = int(self.cbx_baud_rate.currentText())
45
46        if not port:
47            QMessageBox.warning(self, "警告", "请输入串口号")
48            return
49
50        try:
51            if self.serial_manager.is_connected():
52                self.serial_manager.disconnect()
53                self.btn_connect_serial.setText("连接串口")
54                self.btn_start_test.setEnabled(False)
55                self.statusBar().showMessage("设备已断开")
56            else:
57                self.serial_manager.connect(port, baud_rate)
58                self.btn_connect_serial.setText("断开串口")
59                self.btn_start_test.setEnabled(True)
60                self.statusBar().showMessage(f"已连接到 {port} @ {baud_rate}bps")
61        except Exception as e:
62            QMessageBox.critical(self, "错误", f"串口连接失败:{str(e)}")
63
64    def on_start_test_clicked(self):
65        """开始测试按钮点击事件"""
66        try:
67            self.serial_manager.send_command("START_TEST")
68            self.statusBar().showMessage("测试进行中...")
69            self.btn_start_test.setEnabled(False)
70        except Exception as e:
71            QMessageBox.critical(self, "错误", f"测试启动失败:{str(e)}")
72
73    def on_serial_data_received(self, data):
74        """串口数据接收事件"""
75        # 在UI线程中更新数据显示
76        self.tbl_test_data.append(data)
77        self.statusBar().showMessage(f"收到数据:{data}")

3. 创建程序入口

在项目根目录创建main.py

1import sys
2from PySide6.QtWidgets import QApplication
3from views.main_window import MainWindow
4
5if __name__ == "__main__":
6    # 启用高DPI支持(解决4K屏幕模糊问题)
7    QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
8    
9    app = QApplication(sys.argv)
10    window = MainWindow()
11    window.show()
12    sys.exit(app.exec())

4. 运行程序

在 PyCharm 中右键点击main.pyRun 'main',即可启动应用。

五、PyCharm 专属调试技巧(核心优势)

PyCharm 的调试功能是其最大优势,特别适合排查串口通信、数据处理等复杂问题:

1. 基础调试操作

  • 设置断点:点击代码行号左侧的空白处,出现红色圆点即断点设置成功
  • 启动调试:右键点击main.pyDebug 'main'(快捷键 Shift+F9)
  • 单步执行:F8(步过)、F7(步入)、Shift+F8(步出)
  • 查看变量:在 Debug 面板的 Variables 窗口查看所有变量值
  • 监视表达式:在 Watches 窗口添加需要监视的变量或表达式

2. 高级调试技巧

  • 异常断点:在 Debug 面板点击View Breakpoints → 勾选Any Exception,程序抛出异常时自动暂停
  • 条件断点:右键点击断点 → 设置条件(如data == "TEST_PASS"),满足条件时才暂停
  • 日志断点:右键点击断点 → 取消勾选 "Suspend",勾选 "Log message to console",不暂停程序只输出日志
  • 附加到进程:如果程序已经运行,可以通过Run → Attach to Process附加调试

3. 常见问题排查

  • 导入错误:确认根目录已标记为 Sources Root
  • UI 修改不生效:确认已右键转换 UI 文件,且运行的是最新代码
  • 串口数据不更新:检查串口通信是否在 QThread 中运行(避免阻塞 UI 线程)
  • 程序闪退:启用异常断点,定位崩溃位置

六、资源文件与样式表处理

1. 资源文件配置

  1. resources/目录创建resources.qrc
1<RCC>
2    <qresource prefix="/">
3        <file>icons/connect.png</file>
4        <file>icons/start.png</file>
5        <file>qss/style.qss</file>
6    </qresource>
7</RCC>

2. QSS 样式表美化

  1. resources/qss/目录创建style.qss,编写样式
  2. MainWindow.__init__中加载:
1# 加载全局样式表
2with open("resources/qss/style.qss", "r", encoding="utf-8") as f:
3    self.setStyleSheet(f.read())

七、打包与分发(PyCharm 集成)

1. 安装 PyInstaller

pip install pyinstaller

2. 配置 PyCharm 打包运行配置

  1. 菜单栏:Run → Edit Configurations
  2. 点击+ → 选择Python
  3. 配置参数:
  4. 点击 "OK" 保存

3. 一键打包

点击 PyCharm 右上角的运行按钮,选择 "打包应用",即可自动打包。打包完成后,可执行文件生成在dist/目录下。

八、PyCharm 专属最佳实践

  1. 使用 QThread 处理耗时任务:串口通信、数据采集、测试用例执行等必须放在子线程,避免界面卡顿
1from PySide6.QtCore import QThread, Signal
2
3class TestThread(QThread):
4    test_finished = Signal(bool)
5    progress_updated = Signal(int)
6
7    def run(self):
8        for i in range(101):
9            self.progress_updated.emit(i)
10            self.msleep(100)
11        self.test_finished.emit(True)
  • 使用 PyCharm 的重构功能:重命名控件、方法时,PyCharm 会自动更新所有引用,避免手动修改出错
  • 代码模板:在File → Settings → Editor → File and Code Templates中添加自定义模板,快速创建主窗口、对话框等文件
  • 版本控制:PyCharm 集成 Git,提交时自动忽略_ui.py_rc.py__pycache__等自动生成文件

PySide6 + Qt Designer + PyCharm 完整开发流程》 是转载文章,点击查看原文


相关推荐


claude-code下载安装与使用
veminhe2026/6/2

1、官方网站 Claude Code by Anthropic | AI Coding Agent, Terminal, IDE 2、github的项目地址 GitHub - anthropics/claude-code: Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing ro


从社区路标到生态基石:Dave Verwer 的新篇章 -- 肘子的 Swift 周报 #137
东坡肘子2026/5/26

从社区路标到生态基石:Dave Verwer 的新篇章 Dave Verwer 在 iOS Dev Weekly 第 751 期宣布,这份已经持续近 15 年的周报将交由新的团队继续运营,而他自己接下来会全职投入 Swift Package Index。我的博客在早期获得关注,也曾得益于 iOS Dev Weekly 的推荐;而我在周报中坚持撰写每期周评,同样在很大程度上受到 Dave Verwer 的启发。对于很多 Apple 平台开发者来说,iOS Dev Weekly 早已不只是一份链接合


C 标准库 - <assert.h>
lsx2024062026/5/4

C 标准库 - <assert.h> 引言 在C语言编程中,错误检测和处理是保证程序稳定性和可靠性的重要环节。《assert.h》头文件提供了用于在开发过程中进行断言检查的函数,这些函数在编译时默认是开启的。本文将详细介绍C标准库中<assert.h>的相关内容,包括其使用方法、作用以及在实际开发中的应用。 断言简介 断言(assertion)是一种用于在程序运行时检测错误的方法。当断言的条件为假时,程序将终止运行,并打印出错误信息。这使得开发者能够快速定位并修复代码中的问题。 <assert.


我学习到的结构化提示词三技巧
前端工作日常2026/4/25

提示词框架(Prompt Framework) 在大模型中,设计一组清晰且结构化的提示词,用以引导模型生成特定类型的输出。 它有助于提高生成的准确性、相关性和质量,确保模型的回应更符合用户的需求。 一个简单的结构化提示词来改写我们的问题输入 在 Coze 上创建一个智能体,在“人设与回复逻辑”那里输入: 你是一位曾经就职于互联网头部企业的资深软件工程师和IT教育专家,擅长用通俗易懂的语言来给初学者讲解! 根据用户的输入,整理一门入门级技术课程的大纲,要求: 1.注重基本概念和原理,为学员打下


Spring Boot一键限速:守护你的接口“高速路”
小码哥_常2026/4/16

Spring Boot一键限速:守护你的接口“高速路” 为什么网络限速很重要 在当今互联网应用广泛的时代,网络限速绝非多此一举,而是保障系统稳定、高效运行的关键策略。想象一下电商平台举办秒杀活动,成千上万的用户在同一时刻疯狂点击抢购按钮,倘若没有网络限速机制,瞬间涌入的海量请求可能会直接把服务器 “压垮”,导致整个系统瘫痪,无论是正常用户的购买请求,还是服务器后续的订单处理,都无法顺利进行。 再看看视频平台,每到热门剧集首播或者大型体育赛事直播时,大量用户同时在线观看,对视频资源的请求量呈爆发式


从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
半行代码2026/4/8

Claude Code 是 Anthropic 推出的终端 AI 编程助手。与普通的聊天式 AI 不同,它直接在终端里工作,能够读取代码、执行命令、修改文件、管理 Git 操作。阅读其源码后,可以从 Agent 循环、上下文工程、提示词工程和多 Agent 协同几个维度梳理出它的设计脉络。 整体架构 Claude Code 的核心是一个典型的 ReAct Agent 架构,入口是 query() 函数,它内部委托给 queryLoop() —— 一个通过 while(true) 无限循环驱动的


OpenClaw 接入 Telegram:BotFather 实战
七夜zippoe2026/3/31

目录 摘要1. 引言2. Telegram Bot API 介绍2.1 什么是 Telegram Bot API2.2 Bot 与普通用户的区别2.2 Bot 的核心特性2.3 API 通信模式2.4 消息类型与格式2.5 API 请求示例 3. 通过 BotFather 创建机器人3.1 BotFather 简介3.2 创建 Bot 的详细步骤3.3 Bot 配置选项3.4 配置命令示例3.5 Bot 头像与品牌设置3.6 多语言支持 4. 获取 Bot Token 与安全实践4


Agent Skills:让 AI 一次学会、永远记住的能力扩展方案
草捏子2026/3/23

导语 程序员阿明最近发现一个让他崩溃的事——他的 AI 助手明明昨天才学会怎么写周报,今天换个对话窗口又全忘了。"这 AI 跟金鱼一样,7 秒钟记忆。"他跟同事吐槽。直到同事给他发了一个叫 Agent Skills 的东西,从此阿明再也没有复制粘贴过那段周报格式说明。 Agent Skills 到底是什么?它解决了什么痛点?怎么用?今天我们彻底搞明白。 1. 从"金鱼记忆"到"活的员工手册" 先讲阿明的故事。他每次让 AI 写周报,都要先花十分钟描述格式:分"本周完成""进行中""下周计划"三个


微信小程序开发01:XR-FRAME的快速上手
海石2026/3/15

一、前言 最近要基于微信小程序实现一个具备AR功能的APP,在进行技术选型时,发现小程序本身自带了XR-FRAME这个框架, 从描述上来看: 没有比它更“合适”的,用来进行AR功能开发的框架了 本来想使用 Vibe Coding 无痛完成开发,但是却在实际使用中,发现大模型写不太来 wxml 和<xr-...>相关的代码 于是在此开了一个系列文章,用来记录我遇到的坑 😓 二、从 1 到 1.x 个人的建议,一开始不从0到1,而是从1到1.x,即基于现有的demo二次开发一个 否则,如果想在


ubuntu + Docker + piper + 实现TTS自由
Android小码家2026/3/6

文章目录 前言启动脚本启动容器模型下载使用方式 前言 为什么要使用这种框架,原因很简单,分离环境和工作区间,因为我不可能只跑一个应用,因此docker就是最好的选择。 背景是实现文字转语音的简单AI功能,实现转化自由,为什么叫ai因为它集成了hugeface的语音ai模型。 启动脚本 # 使用 Ubuntu 22.04 LTS(你指定的版本) FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive # 安

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读