python-PyQt6库学习

PyQt6 超详细解析(贴合你的工业上位机开发场景)

PyQt6 是 Python 中最主流的 GUI(图形用户界面)开发库,基于 Qt6(跨平台 C++ GUI 框架)封装,能帮你快速开发出专业、稳定、跨平台的桌面应用(比如你需要的实车 CAN 测试上位机)。

一、核心定位与优势

表格

核心优势 对你的价值(实车测试上位机)
跨平台 开发的 exe 可在 Windows/Linux/macOS 运行,适配不同测试电脑
功能全 支持工业软件所需的所有 UI 组件(表格、图表、串口 / CAN 通信、文件对话框等)
性能优 基于 C++ 的 Qt 内核,比纯 Python 写的 UI(如 Tkinter)流畅,适配大量报文实时显示
易扩展 可直接调用 C/C++ 写的 DLL(如解锁 DLL、CAN 硬件驱动),无缝对接汽车电子底层
可视化设计 支持 Qt Designer 拖拽式设计 UI,无需手写大量界面代码

二、PyQt6 核心组成(按模块拆分)

PyQt6 拆分为多个子模块,每个子模块都具备不同的功能,开发上位机只需重点掌握核心模块:

表格

模块名 核心功能 你的上位机开发场景应用 常用类 / 函数(直接可用)
PyQt6.QtWidgets 所有基础 UI 组件(窗口、按钮、表格、菜单、对话框等) 开发主窗口、设备配置面板、报文监控表格、文件选择对话框 - 主窗口QMainWindow(带菜单栏 / 状态栏)- 基础组件QPushButton(按钮)、QLabel(文本)、QLineEdit(输入框)、QComboBox(下拉选择)- 布局QVBoxLayout(垂直)、QHBoxLayout(水平)、QGridLayout(网格)、QFormLayout(表单)- 表格QTableWidget(报文 / 用例表格)、QTableWidgetItem(单元格)- 对话框QFileDialog(文件选择)、QMessageBox(提示框)、QDialog(自定义弹窗)- 菜单QMenuBarQMenuQAction
PyQt6.QtCore 核心功能(信号与槽、事件循环、定时器、文件 / 路径处理) 实现按钮点击触发 CAN 发送、报文接收实时刷新、工程保存 / 加载 - 信号与槽pyqtSignal(自定义信号)、connect()(绑定信号 - 槽)- 定时器QTimer(定时刷新报文 / 状态)- 线程QThread(耗时操作放子线程,防 UI 卡死)- 文件 / 路径QDirQFileQFileInfo(工程文件管理)- 事件循环QCoreApplication.exec()(启动 UI 主循环)- 时间QDateTimeQTime(报文时间戳记录)
PyQt6.QtGui 图形相关(字体、图标、颜色、绘图) 自定义报文监控界面的颜色(PASS/FAIL 标红 / 绿)、设置软件图标 - 颜色QColorQt.GlobalColor(如 Qt.red/Qt.green)- 字体QFont(设置表头 / 报文字体)- 图标QIcon(设置软件 / 按钮图标)- 画笔 / 画刷QPainterQPenQBrush(自定义绘制报文状态图标)- 图片QPixmap(加载图片作为背景 / 图标)
PyQt6.QtNetwork 网络通信(TCP/UDP/HTTP) 上位机与 ECU / 测试设备的网络通信(如远程调试) - TCPQTcpSocketQTcpServer(客户端 / 服务端通信)- UDPQUdpSocket(广播 / 组播报文)- HTTPQNetworkAccessManager(发送 HTTP 请求,如上传测试报告)
PyQt6.QtSerialPort 串口通信 适配串口型 CAN 适配器(如 USB-CAN) - QSerialPort(打开 / 配置串口:波特率、数据位、校验位)- QSerialPortInfo(枚举可用串口设备)- 信号:readyRead(串口有数据可读时触发)
PyQt6.QtCharts 图表绘制(可未来使用填充) 实时绘制 CAN 信号曲线(如车速、电压变化) - 图表容器QChartQChartView(承载图表)- 曲线QLineSeries(折线图,适合信号趋势)- 坐标轴QValueAxis(数值轴)、QDateTimeAxis(时间轴)- 数据点append()(实时添加 CAN 信号数据)
PyQt6.uic 加载 Qt Designer 设计的 .ui 文件 拖拽设计 UI 后,直接在 Python 中加载使用 - loadUi()(从 .ui 文件加载界面到 Python 类)- compileUi()(将 .ui 编译为 .py 代码,避免运行时加载)

三、PyQt6 核心概念(必懂)

1. 信号与槽(Signal & Slot)------ UI 交互的核心

这是 PyQt6 最核心的机制,实现「用户操作→程序响应」的逻辑(比如点击 "发送报文" 按钮,触发 CAN 报文发送)。

  • 信号:UI 组件发出的 "事件通知"(如按钮被点击、输入框内容变化);
  • :(准确的来讲,叫槽函数更合适一些)响应信号的函数(如点击按钮后执行的 send_can_msg() 函数);
  • 绑定:将信号和槽关联,信号(比如上位机中的发送按键)触发时自动执行槽函数。

示例(贴合你的场景)

python

python 复制代码
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow): #这是一个主函数的基类
    def __init__(self):
        super().__init__()
        self.btn_send = QPushButton("发送CAN报文", self)
        # 绑定信号(点击按钮)和槽(自定义函数)
        self.btn_send.clicked.connect(self.send_can_msg)

    def send_can_msg(self):
        """槽函数:发送CAN报文"""
        print("发送0x123报文成功!")

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()
2. 窗口体系(Window)

PyQt6 的窗口分为核心层级,适配你的上位机结构:

  • QMainWindow:主窗口(带菜单栏、工具栏、状态栏)→ 你的上位机主界面;
  • QWidget:通用窗口(无默认布局)→ 设备配置、报文监控等子面板;
  • QDialog:对话框(如文件选择、提示框、配置弹窗)→ 加载 DBC/Excel 的弹窗。
3. 布局管理(Layout)

解决 UI 组件的排版问题(避免组件位置固定,窗口缩放后错乱),核心布局:

表格

布局类 作用 应用场景
QVBoxLayout 垂直布局 报文监控面板:从上到下排列 "报文 ID、数据、时间、状态"
QHBoxLayout 水平布局 工具栏:从左到右排列 "发送、停止、清空" 按钮
QGridLayout 网格布局 设备配置面板:行 / 列排列 "设备类型、通道、波特率" 输入框
QFormLayout 表单布局 用例参数面板:标签 + 输入框成对排列(如 "参数 a:[输入框]")
模块名 核心功能 你的上位机开发场景应用 常用类 / 函数(直接可用)
PyQt6.QtWidgets 所有基础 UI 组件(窗口、按钮、表格、菜单、对话框等) 开发主窗口、设备配置面板、报文监控表格、文件选择对话框 - 主窗口QMainWindow(带菜单栏 / 状态栏)- 基础组件QPushButton(按钮)、QLabel(文本)、QLineEdit(输入框)、QComboBox(下拉选择)- 布局QVBoxLayout(垂直)、QHBoxLayout(水平)、QGridLayout(网格)、QFormLayout(表单)- 表格QTableWidget(报文 / 用例表格)、QTableWidgetItem(单元格)- 对话框QFileDialog(文件选择)、QMessageBox(提示框)、QDialog(自定义弹窗)- 菜单QMenuBarQMenuQAction
PyQt6.QtCore 核心功能(信号与槽、事件循环、定时器、文件 / 路径处理) 实现按钮点击触发 CAN 发送、报文接收实时刷新、工程保存 / 加载 - 信号与槽pyqtSignal(自定义信号)、connect()(绑定信号 - 槽)- 定时器QTimer(定时刷新报文 / 状态)- 线程QThread(耗时操作放子线程,防 UI 卡死)- 文件 / 路径QDirQFileQFileInfo(工程文件管理)- 事件循环QCoreApplication.exec()(启动 UI 主循环)- 时间QDateTimeQTime(报文时间戳记录)
PyQt6.QtGui 图形相关(字体、图标、颜色、绘图) 自定义报文监控界面的颜色(PASS/FAIL 标红 / 绿)、设置软件图标 - 颜色QColorQt.GlobalColor(如 Qt.red/Qt.green)- 字体QFont(设置表头 / 报文字体)- 图标QIcon(设置软件 / 按钮图标)- 画笔 / 画刷QPainterQPenQBrush(自定义绘制报文状态图标)- 图片QPixmap(加载图片作为背景 / 图标)
PyQt6.QtNetwork 网络通信(TCP/UDP/HTTP) 上位机与 ECU / 测试设备的网络通信(如远程调试) - TCPQTcpSocketQTcpServer(客户端 / 服务端通信)- UDPQUdpSocket(广播 / 组播报文)- HTTPQNetworkAccessManager(发送 HTTP 请求,如上传测试报告)
PyQt6.QtSerialPort 串口通信 适配串口型 CAN 适配器(如 USB-CAN) - QSerialPort(打开 / 配置串口:波特率、数据位、校验位)- QSerialPortInfo(枚举可用串口设备)- 信号:readyRead(串口有数据可读时触发)
PyQt6.QtCharts 图表绘制(可未来使用填充) 实时绘制 CAN 信号曲线(如车速、电压变化) - 图表容器QChartQChartView(承载图表)- 曲线QLineSeries(折线图,适合信号趋势)- 坐标轴QValueAxis(数值轴)、QDateTimeAxis(时间轴)- 数据点append()(实时添加 CAN 信号数据)
PyQt6.uic 加载 Qt Designer 设计的 .ui 文件 拖拽设计 UI 后,直接在 Python 中加载使用 - loadUi()(从 .ui 文件加载界面到 Python 类)- compileUi()(将 .ui 编译为 .py 代码,避免运行时加载)

示例(表单布局)

python

python 复制代码
from PyQt6.QtWidgets import QWidget, QFormLayout, QLineEdit, QComboBox

class DeviceConfig(QWidget):
    def __init__(self):
        super().__init__()
        layout = QFormLayout(self)
        # 表单布局:标签 + 组件
        layout.addRow("设备类型:", QComboBox())  # PCAN/VN1640
        layout.addRow("通道号:", QLineEdit("1"))
        layout.addRow("波特率:", QLineEdit("500000"))
4. Qt Designer(可视化 UI 设计)

无需手写 UI 代码,通过拖拽方式设计界面,生成 .ui 文件后,用 uic 模块加载到 Python 中:

  • 步骤 1 :打开 Qt Designer → 拖拽组件(按钮、表格、输入框)→ 保存为 main_window.ui

  • 步骤 2 :Python 加载 UI:

    python

    运行

    复制代码
    from PyQt6.uic import loadUi
    from PyQt6.QtWidgets import QMainWindow
    
    class MyWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            loadUi("main_window.ui", self)  # 加载设计好的UI
            # 绑定按钮事件
            self.btn_send.clicked.connect(self.send_msg)
        
        def send_msg(self):
            print("发送报文")
  • 优势:大幅降低 UI 开发成本,适合工业上位机这种组件多、布局复杂的场景。

四、PyQt6 核心功能(贴合你的 CAN 测试上位机)

1. 文件操作(工程保存 / 加载、资源导入)

python

复制代码
# 打开工程文件(只显示.cantest后缀)
from PyQt6.QtWidgets import QFileDialog

file_path, _ = QFileDialog.getOpenFileName(
    self,                  # 父窗口
    "打开CAN测试工程",      # 对话框标题
    "./",                  # 默认路径
    "CAN工程 (*.cantest)"  # 文件过滤(只显示指定后缀)
)

# 保存工程文件
save_path, _ = QFileDialog.getSaveFileName(
    self,
    "保存工程",
    "./",
    "CAN工程 (*.cantest)"
)
2. 表格组件(报文监控、用例结果展示)

python

运行

复制代码
from PyQt6.QtWidgets import QTableWidget, QTableWidgetItem

# 创建表格(5列:ID、数据、时间、状态、解析值)
self.msg_table = QTableWidget(0, 5)
self.msg_table.setHorizontalHeaderLabels(["报文ID", "数据", "时间", "状态", "解析值"])

# 添加一行报文数据
row = self.msg_table.rowCount()
self.msg_table.insertRow(row)
self.msg_table.setItem(row, 0, QTableWidgetItem("0x123"))
self.msg_table.setItem(row, 1, QTableWidgetItem("01 02 03 04"))
self.msg_table.setItem(row, 2, QTableWidgetItem("2026-03-11 10:00:00"))
self.msg_table.setItem(row, 3, QTableWidgetItem("PASS"))  # 绿色字体
self.msg_table.item(row, 3).setForeground(Qt.GlobalColor.green)
3. 定时器(实时刷新报文、监控状态)

python

python 复制代码
from PyQt6.QtCore import QTimer

# 创建定时器(每隔100ms刷新一次报文表格)
self.timer = QTimer(self)
self.timer.setInterval(100)  # 100ms
self.timer.timeout.connect(self.refresh_msg_table)  # 定时触发刷新函数
self.timer.start()  # 启动定时器

def refresh_msg_table(self):
    """刷新报文表格(读取CAN总线新报文)"""
    new_msg = self.can_driver.recv_msg()  # 调用你的CAN驱动读取报文
    if new_msg:
        # 新增行显示新报文
        row = self.msg_table.rowCount()
        self.msg_table.insertRow(row)
        self.msg_table.setItem(row, 0, QTableWidgetItem(hex(new_msg["id"])))
4. 多线程(避免 UI 卡死)

关键:CAN 报文收发、测试用例执行等耗时操作必须放在子线程,否则 UI 会卡住无响应:

python

运行

复制代码
from PyQt6.QtCore import QThread, pyqtSignal

# 定义子线程类(处理CAN报文接收)
class CANRecvThread(QThread):
    # 定义信号:接收到新报文时发送给主线程
    new_msg_signal = pyqtSignal(dict)

    def __init__(self, can_driver):
        super().__init__()
        self.can_driver = can_driver
        self.running = True

    def run(self):
        """线程执行函数(循环接收报文)"""
        while self.running:
            msg = self.can_driver.recv_msg(timeout=0.1)
            if msg:
                self.new_msg_signal.emit(msg)  # 发送信号给主线程

    def stop(self):
        self.running = False

# 主线程中使用
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.can_driver = CANDriverFactory.create_driver("VN1640", 1, 500000)
        # 创建子线程
        self.recv_thread = CANRecvThread(self.can_driver)
        # 绑定信号:子线程收到报文 → 主线程更新表格
        self.recv_thread.new_msg_signal.connect(self.add_msg_to_table)
        self.recv_thread.start()  # 启动线程

    def add_msg_to_table(self, msg):
        """主线程更新表格(安全操作UI)"""
        row = self.msg_table.rowCount()
        self.msg_table.insertRow(row)
        self.msg_table.setItem(row, 0, QTableWidgetItem(hex(msg["id"])))

五、PyQt6 安装与环境配置

1. 安装命令

bash

运行

复制代码
# 核心库
pip install PyQt6
# 可选:Qt Designer(可视化设计工具)
pip install pyqt6-tools
2. 验证安装

python

运行

复制代码
import PyQt6.QtWidgets as qtw
app = qtw.QApplication([])
window = qtw.QMainWindow()
window.setWindowTitle("PyQt6测试")
window.show()
app.exec()

运行后弹出空白窗口,说明安装成功。

六、PyQt6 vs 其他 GUI 库(对比选择)

表格

库名 优势 劣势 适合场景
PyQt6 功能全、性能优、跨平台、支持 DLL 调用、工业级 学习曲线稍陡 你的 CAN 测试上位机(需复杂 UI、硬件交互)
Tkinter Python 内置、轻量、入门快 功能少、界面简陋、性能一般 简单工具(如小型脚本 UI)
PySide6 和 PyQt6 功能几乎一致(同为 Qt6 封装) 生态稍弱于 PyQt6 开源项目(LGPL 协议)
Kivy 支持移动端、触摸操作 桌面端体验差、工业组件少 移动端 / 平板 UI

七、学习建议(针对你的场景)

1. 入门阶段(1-2 天)
  • 掌握核心组件:QMainWindowQWidgetQPushButtonQTableWidgetQFileDialog
  • 理解「信号与槽」机制(UI 交互的核心);
  • 用 Qt Designer 拖拽设计简单界面并加载。
2. 进阶阶段(3-5 天)
  • 学习布局管理(QVBoxLayout/QGridLayout),保证界面自适应;
  • 掌握多线程(QThread),避免 UI 卡死;
  • 实现文件操作(工程保存 / 加载)、表格动态刷新。
3. 实战阶段(贴合你的需求)
  • 整合 CAN 驱动、DBC 解析、用例执行逻辑到 PyQt6 界面;
  • 实现报文监控、测试结果展示、工程保存 / 加载;
  • 用 PyInstaller 打包成 exe。

八、总结

  1. 核心定位:PyQt6 是 Python 中最适合开发工业级上位机的 GUI 库,能完美支撑你「CAN 测试上位机」的所有需求(工程管理、报文监控、硬件交互、DLL 调用);
  2. 关键知识点:信号与槽(交互)、多线程(防卡死)、表格组件(报文展示)、文件对话框(工程操作)、Qt Designer(可视化设计);
  3. 落地建议:先搭好 UI 框架(主窗口、菜单、面板),再逐步整合你的底层逻辑(CAN 驱动、DBC 解析、用例执行),最后实现工程保存 / 加载和打包。
相关推荐
小二·2 小时前
Go 语言系统编程与云原生开发实战(第36篇)
开发语言·云原生·golang
奔跑的蜗牛FelixChioa2 小时前
python连接sqlite快速入门
开发语言·python·sqlite
不会写DN2 小时前
Go中的Tcp编程为什么总是能看到handle?
开发语言·网络·后端·tcp/ip·golang
圆弧YH2 小时前
排版基本操作
学习
飞Link2 小时前
进阶时序建模:门控递归单元 (GRU) 深度解析与实战
开发语言·人工智能·rnn·深度学习·gru
Westward-sun.2 小时前
【Python+PyTorch】从零实现食物识别:自动生成标注 + CNN 训练全流程
pytorch·python·cnn
格林威2 小时前
工业相机图像高速存储(C++版):先存内存,后批量转存方法,附海康相机实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·工业相机·堡盟相机
蓝净云2 小时前
python包管理工具uv
python·uv
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 19 章-时序模型
人工智能·python·学习·机器学习·计算机视觉·时序模型