文章目录
- 一.前言
- 二.技术介绍
- 1.PyQt5
- 2.QSS
- 3.QThread多线程技术
- 4.QRC资源管理
- 5.黑白主题切换
- 三.效果展示
- 1.主界面
- 2.APP页面
- 3.空调控制页面
- 4.导航页面
- 5.电话页面
- 6.360全景页面
- 7.设置页面
- 1.基本设置
- 2.车辆控制
- 3.灯光设置
- 4.辅助驾驶
- 5.显示设置
- 6.声音设置
- 7.系统设置
- 四.项目开发心得
- 1.主题深浅切换
- 2.项目架构
- 3.发布订阅模型
- 5.关于软件开发系统的理解
- 6.多继承
- 7.代码量
- 8.如何使用全局自定义字体
- 9.如何使用QRC资源
- 10.代码洁癖
- 11.项目所用PyQt5子类一览表
- 五.项目部署
- 1.源码直接部署
- 1. 准备项目目录
- 2.创建虚拟环境
- 3.激活虚拟环境
- Windows:
- 4.安装依赖
- 5.检查 PyQt5 是否正确安装
- 6.运行项目(本机启动)
- 2、PyCharm部署
- 1.设置解释器
- 2.运行配置
- 3、常见本机部署问题
- 1. ModuleNotFoundError
- 2. PyQt5插件错误(platforms)
- 3. Working Directory 错误
- 4. 相对路径失效
- 4、推荐一键启动方式
- start.bat
- 5、最终本机部署总结
- 六.总结
- 七.扩展阅读
- 1.车载平板
- 2.档位
- 3.HUD
- 4.油车&电车
- 5.汽车传感器
- 6.空调系统
- 7.灯光系统
- 8.刹车系统
- 9.动力系统
- 八.参考
关键字:#PyQt5 #Qt框架 #PythonGUI开发 #桌面应用开发 #车机系统 #智能座舱 #小米风格UI #UI界面设计 #人机交互 #图形界面开发 #跨平台开发 #模块化设计 #多页面架构 #主题切换 #自定义控件 #界面美化
#项目实战 #软件架构设计 #交互逻辑 #多媒体系统 #车辆中控系统 #智能汽车软件 #车载娱乐系统 #导航系统 #语音交互 #系统设计思路 #开发实践 #GUI框架 #界面组件 #开发教程 #图文教程 #CSDN博客 #工程化开发
#界面布局设计 #软件开发学习 #Python项目实战 #UI原型设计 #智能生态 #设备互联 #Qt界面设计
一.前言
随着智能汽车的发展,车机系统已经成为连接车辆、驾驶员与智能生态的重要枢纽。从最初简单的多媒体播放,到如今集导航、语音交互、车辆控制、应用生态于一体的智能座舱,车机系统的复杂度和用户体验要求都在不断提升。作为一名软件开发爱好者,我一直对这类大型图形化系统的架构设计和交互实现充满兴趣。
在日常使用智能设备的过程中,我尤其欣赏小米在人机交互设计、界面风格统一性以及设备生态联动方面的理念。当小米正式进入汽车领域后,我开始思考:如果完全基于 Python 和
PyQt5,从零开始实现一套具有“小米风格”的车机系统,究竟会遇到哪些技术挑战?又能够达到怎样的完成度?
带着这样的想法,我开启了这个项目。项目并非对真实车机系统进行简单复刻,而是以学习和实践为目的,尝试模拟现代智能座舱的核心功能与交互逻辑。整个系统采用 PyQt5
作为图形界面框架,通过自定义组件、多页面架构、主题切换、模块化设计,逐步构建出一个具备车机界面形态的软件系统。 一方面,这个项目是对桌面 GUI
开发能力的一次系统性锻炼;另一方面,也希望借此深入理解现代车机软件在界面设计、功能组织以及用户体验上的设计思路。本文将记录项目从构思、架构设计到功能实现的全过程,并分享在开发过程中遇到的问题、解决方案以及一些技术上的思考。
本次我将以图文的方式详细地介绍一款使用PyQt5开发的小米车机软件系统!
二.技术介绍
本节我将介绍本系统用到的技术
1.PyQt5
PyQt5 是一套基于 Qt 框架的 Python 图形界面开发库,由 Riverbank Computing 提供维护。它将功能强大的 Qt C++ 库封装为 Python 接口,使开发者能够使用 Python 快速构建跨平台桌面应用程序。PyQt5 支持 Windows、Linux 和 macOS,拥有丰富的控件组件,包括按钮、文本框、表格、树形视图、菜单栏、工具栏等,同时支持网络通信、多线程、数据库访问、文件处理以及图形绘制等高级功能。开发者既可以通过代码动态创建界面,也可以结合 Qt Designer 可视化设计工具进行界面布局,再将生成的 UI 文件转换为 Python 代码使用。PyQt5 采用信号与槽(Signal-Slot)机制处理事件,能够有效实现界面与业务逻辑的解耦,提高程序的可维护性。由于其开发效率高、界面美观、生态成熟,因此被广泛应用于数据分析工具、管理系统、自动化软件、科研平台以及各种企业级桌面应用开发,是 Python GUI 开发领域最常用的框架之一。
2.QSS
QSS(Qt Style Sheets)是 Qt 提供的一种界面样式定制技术,其语法与网页开发中的 CSS(层叠样式表)非常相似,主要用于控制 Qt 应用程序中各类控件的外观显示。通过 QSS,开发者可以方便地设置按钮、标签、输入框、表格、菜单等控件的颜色、字体、边框、背景、圆角以及鼠标悬停效果等样式,而无需修改控件的业务逻辑代码。 在 PyQt5 开发中,QSS 是实现界面美化的重要手段。开发者可以为单个控件设置样式,也可以为整个应用程序统一加载样式文件,实现整体主题风格的切换。例如,可以通过 QSS 将普通按钮设计成现代化扁平风格,设置不同状态下(正常、悬停、按下、禁用)的显示效果,从而提升用户体验。 QSS 支持控件选择器、对象名称选择器、伪状态选择器等多种方式,能够精确控制界面元素。例如
QPushButton:hover用于设置鼠标悬停状态样式,QLineEdit用于统一设置所有输入框样式。由于其易学易用、维护方便、界面效果丰富,QSS 已成为 PyQt5 和 Qt 应用程序界面美化与主题设计的核心技术之一。通过合理运用 QSS,可以在不改变程序功能的前提下显著提升软件的专业性和视觉效果。
3.QThread多线程技术
QThread 是 Qt 框架提供的线程类,也是 PyQt5 中实现多线程编程的核心技术之一。它主要用于将耗时操作放到后台线程执行,避免阻塞主线程(GUI 线程),从而保证界面始终保持响应状态。当程序执行文件读写、网络请求、数据库操作、图像处理或复杂计算等耗时任务时,如果直接在主线程中运行,界面往往会出现卡顿甚至“未响应”的情况,而使用 QThread 可以有效解决这一问题。 在 PyQt5 中,QThread 通常与信号(Signal)和槽(Slot)机制结合使用。工作线程负责执行耗时任务,并通过自定义信号将运行结果、进度信息或状态变化发送给主线程,由主线程负责更新界面。由于 Qt 规定 GUI 控件只能在主线程中操作,因此这种通信方式既保证了线程安全,又提高了程序的稳定性。 QThread 的实现方式主要有两种:一种是继承 QThread 类并重写
run()方法;另一种是创建QObject工作对象,并通过moveToThread()将其移动到独立线程中执行。后者结构更加清晰,符合 Qt 官方推荐的设计模式。 借助 QThread,开发者可以实现后台数据处理、实时任务监控、进度条更新以及并发任务管理等功能,大幅提升应用程序的运行效率和用户体验。因此,QThread 已成为 PyQt5 开发大型桌面应用和高性能工具软件时不可或缺的重要技术。
4.QRC资源管理
QRC(Qt Resource Collection)是 Qt 框架提供的一种资源管理机制,在 PyQt5 开发中被广泛用于统一管理应用程序中的静态资源,如图片、图标、字体、音频以及 QSS 样式文件等。通过 QRC,可以将这些资源文件打包进程序内部,而不再依赖外部文件路径,从而显著提升程序的可移植性和稳定性。 QRC 的核心是
.qrc资源描述文件,该文件采用 XML 格式,用于声明项目中需要使用的资源及其虚拟路径。开发者可以在.qrc文件中将资源分类管理,例如图片资源、界面样式资源等。随后使用pyrcc5工具将.qrc文件编译为 Python 模块,在程序中导入该模块后即可通过:/前缀访问资源,例如:/images/icon.png#pic_center。 这种机制的优势在于资源统一封装,避免了因路径错误或文件缺失导致的运行问题,同时也简化了软件发布流程,使程序可以独立运行而无需额外资源文件。此外,QRC 还能提高代码结构的清晰度,使资源管理更加规范化。在实际开发中,QRC 常与 Qt Designer、QSS 样式表以及图标系统结合使用,用于构建美观、稳定且易于部署的桌面应用程序。因此,QRC 是 PyQt5 工程化开发中不可或缺的重要组成部分。
5.黑白主题切换
黑白主题切换是现代桌面应用中常见的界面个性化功能,主要用于在亮色模式(白色主题)与暗色模式(黑色主题)之间进行动态切换,从而适应不同使用环境与用户偏好。在 PyQt5 开发中,这一功能通常通过 QSS(Qt Style Sheets)配合全局样式管理实现。 实现思路一般是提前定义两套 QSS 样式文件,例如 light.qss 和 dark.qss,分别控制界面的背景颜色、字体颜色、边框样式以及控件状态效果。在运行时,根据用户选择或系统设置,动态加载对应的样式表,通过
app.setStyleSheet()应用到整个程序,从而实现主题的即时切换。 黑色主题通常采用深色背景与浅色字体,适合低光环境下使用,可以减少视觉疲劳并降低屏幕眩光;白色主题则以浅色背景为主,视觉清晰,适合日常办公与阅读场景。为了提升用户体验,实际项目中还会结合图标切换、颜色变量统一管理以及动画过渡效果,使主题切换更加平滑自然。 此外,一些高级实现还会将主题配置保存到本地配置文件或数据库中,使程序在下次启动时自动恢复用户上一次选择的界面风格。黑白主题切换不仅提升了软件的交互体验,也增强了应用的专业性与现代感,是界面设计中非常重要的一项功能。
三.效果展示
这里我将展示我们车机系统的界面效果,深色和浅色的界面效果我都将展示给大家。
1.主界面
主界面采用了典型的高度集成化车载交互布局,整体风格简洁且充满科技感,由四大核心区域构成:顶部的状态信息栏实时同步车辆行驶数据、时间与天气,确保用户一眼掌握关键信息;中央是主视觉交互区,通过高精度的车辆模型渲染营造沉浸式体验;中部布置了功能卡片组,将高频使用的导航逻辑、媒体播放与车辆能源状态以可视化卡片形式平铺,兼顾了信息密度与点击便捷性;底部的全局Dock栏则是交互的“中枢神经”,整合了空调温控、系统菜单及高频应用入口。整体采用模块化的布局逻辑,通过圆角处理与半透明背景营造出深邃的视觉层次,不仅逻辑分区严谨,且极大地提升了驾驶场景下的操作效率,充分体现了车机系统“安全第一、交互直观”的设计哲学。
2.APP页面
通过点击左下角的应用图标到APP页面,在APP页面展示了所有的车机系统内置应用,用户通过在页面左右滑动实现切换应用的效果,这里我们展示的都是测试数据,所有的资源都是在QRC里面读取使用的,通过配置数据将图标资源以及名称整理出来,再通过我们自定义的组件APPItem展示应用数据,我们给每个应用设置了独一无二的key,可以点击之后发射信号,在信号总线中连接信号处理数据。
3.空调控制页面
空调控制页面精准呈现了智能座舱的空调控制系统,核心视觉聚焦于车辆内部的 3D
透视图,通过动态冷暖色调的视觉引导,生动展示了气流的分布路径。界面布局采用对称式设计,顶部的控制工具栏集中了开关、自动模式及前后除霜等关键功能,逻辑清晰且响应迅速;两侧的独立温控模块通过简洁的加减箭头,为驾驶员与乘客提供了直观的温区调节体验;底部的吹风模式选择区则采用了卡片式交互,支持“吹面”、“吹脚”及混合模式的一键切换,不仅强化了操作的仪式感,更极大提升了反馈的即时性。整体界面通过深浅配色与动态特效的结合,将复杂的空调逻辑转化为扁平化、图形化的交互语言,在确保行车安全的前提下,充分体现了数字座舱“所见即所得”的易用性与高端感。
4.导航页面
导航是一款车机系统必备的功能,可以说是汽车的眼睛。我们的车机导航界面采用了深度的 3D 地图可视化方案,构建了以驾驶员为核心的沉浸式导航体验。界面主体为高精 3D
地图视图,通过对建筑与道路的立体建模,极大地增强了对复杂路况的空间感知力;左上角嵌入了导航指引卡片,清晰呈现剩余距离、下个路口转向箭头及预计到达时间,确保指令传达准确;紧贴其下的是智能充电推荐列表,实时显示周边充电站的距离与可用充电桩位,解决了电动车的补能焦虑。界面底部中心设计了悬浮式导航功能控制台,提供退出、设置、添加途经点等快捷操作,逻辑紧凑,操作路径极短。最底层依然保留了统一状态/Dock导航栏,保证了在导航模式下依然能快速响应空调、音乐及系统设置需求。整体设计兼顾了宏观的路线总览与微观的精准引导,通过色彩的高对比度区分与信息分层,在车内复杂环境下实现了极佳的识别度与交互效率。
5.电话页面
电话界面是我比较满意的一个页面,采用了模块化的分栏设计,旨在为驾驶者提供最直观的通讯操作体验。界面左侧为设备状态区,清晰标注了当前连接的手机型号(Xiaomi14)及快速管理入口,确保连接状态一目了然;中间核心区域是数字拨号盘,采用大按键高对比度设计,方便行车过程中进行盲操,并配有明确的输入框与删除键;右侧则是通讯信息栏,通过标签页形式将“通话记录”、“联系人”与“收藏”三类数据高效整合,通过列表形式展示通话类型与时间戳,极大地缩短了用户查找联系人的路径。整体设计依托于深色主题,既保证了夜间行车的视线舒适度,又通过极简的布局降低了驾驶员的认知负荷,让通讯功能在车机系统中不仅“好用”,更“易用”。
6.360全景页面
360
度全景泊车辅助界面采用了高度直观的多视角融合设计,核心旨在消除驾驶盲区。界面中心是车辆上帝视角(俯视图),通过四向放射状的相机图标构建起环绕感,配合实时感应雷达距离的颜色预警(绿、黄、红),为驾驶员提供精准的空间位置参考。屏幕两侧则布置了分屏实时监控区,不仅通过广角画面实时捕捉车辆四周的动态,还在影像中叠加了动态轨迹线,根据方向盘转向提供预测性的行驶路径引导,极大地降低了窄道通行与侧方/倒车入库的心理压力。该系统通过将多路摄像头图像实时拼合并与车模动态对齐,实现了从宏观全景到微观路况的无缝切换,在安全性与易用性之间找到了完美的平衡点,充分体现了车机系统在复杂驾驶辅助场景下的逻辑严密性与视觉专业度。
7.设置页面
设置页面包含多个子页面,也是本次开发主要耗时的部分
1.基本设置
基本设置界面采用了经典的双栏式导航布局,这是车机系统保证复杂参数可控性的标准设计。左侧为一级菜单导航栏,将车辆控制、辅助驾驶、显示、隐私等功能进行了逻辑化的分类索引,确保用户能够通过最短路径快速定位至目标模块;右侧则为二级详情与交互区,通过精细的卡片化处理将“驾驶模式”、“能量回收”、“车辆快捷控制”等核心参数以分段式按钮、开关拨杆与滑块的形式展现。这种设计将繁杂的车辆配置项进行了高度结构化处理,利用不同间距与视觉权重区分配置逻辑与即时操作,既保证了信息展示的条理性,又兼顾了行车状态下对配置项进行快速调整的盲操便利性。整体风格沉稳、严谨,通过深色背景提升了界面的高级感,使复杂的系统参数管理变得井井有条,是典型的车规级交互规范应用。
2.车辆控制
这份界面设计采用了经典的现代车载人机交互逻辑,通过侧边导航与右侧主功能区结合的布局,实现了高效的信息组织。界面左侧为垂直导航栏,确保用户能快速切换各控制模块;右侧工作区则以卡片式布局呈现,将底盘悬架、驾驶模式及座椅调节等复杂功能有序分类,并通过中心的车辆俯视图实现可视化交互,点击即可直观操作车门或后备箱。顶部状态栏实时反馈车辆电量、续航及挡位信息,底部Dock栏则提供空调、导航等高频功能的快捷入口。整体采用深色调设计配合细腻的视觉特效,不仅确保了在驾驶环境下的高可读性,更通过高度逻辑化的区域划分,在有限的空间内实现了功能操作与实时监控的完美平衡,展现了专业级车载系统的设计质感。
3.灯光设置
该灯光设置页面延续了整套系统的模块化设计语言,通过将抽象的灯光参数与车辆模型实时关联,构建出一种高度直观且极具沉浸感的交互体验。页面上半部分采用了3D车辆渲染,将“智能行车灯”与“ADB自适应远光灯”等复杂技术功能直接映射到车身模型上,用户通过点击即可直观配置,这种“所见即所得”的设计有效降低了驾驶员的操作认知负荷。下半部分则精细拆分为“车外灯光细节”与“车内氛围灯”两大管理维度:左侧利用滑块控件实现灯光灵敏度、转向随动及延时照明的精细化调节,逻辑严谨;右侧则为氛围灯提供了集颜色选择、亮度控制及动态联动于一体的沉浸式调节面板,配合底部简洁的“灯光模式”切换条,整体界面在保证功能高度专业化的同时,通过清晰的信息层级与现代化的视觉风格,完美兼顾了行车安全性设置的严谨性与座舱舒适性调节的趣味性。
4.辅助驾驶
辅助驾驶页面是整套系统中技术密集度最高、交互逻辑最严谨的核心区域。页面顶部的状态监控区通过实时渲染的行驶环境图,与巡航车速、行驶里程及辅助时长等数据联动,为驾驶员提供最直观的信任背书,配合明显的“READY”标识,极大降低了用户对智能化系统的操作门槛。下方通过高度概括的卡片模块,将车道居中辅助、交通标志识别、盲区监测及自动泊车等功能统一管理,每个模块均支持独立的状态切换与参数预览。特别是左侧区域通过模拟路面环境显示车辆位置,与右侧的功能开关形成了动静结合的布局,不仅让AEB紧急制动、跟车距离调节等复杂安全参数一目了然,更通过合理的权重排序和信息分级,确保了驾驶员在复杂行车场景下能够快速获取关键预警,体现了该系统在安全性、智能化与人机协同设计上的高度成熟。
5.显示设置
“显示设置”页面作为人机交互的视觉中枢,充分体现了系统对环境感知与个性化定制的深耕,通过将主屏、HUD、数字后视镜及副驾娱乐屏整合,实现了跨屏幕的高效联动。页面核心亮点在于其智能化适配能力,不仅通过数据图表将复杂的亮度传感器反馈可视化,更提供了细腻的对比度、饱和度及字体大小调节,确保用户在任何环境下都能获得舒适的阅读体验。此外,系统内置了丰富的场景化护眼策略,如导航夜间减亮、低电量自适应调节等,在保障行车安全的同时,极大提升了座舱的人文关怀感。该界面以高度模块化的设计,将专业级参数调节与直观的预览窗口完美融合,既满足了极客用户的精细化调优需求,又保持了整车交互界面的简洁与逻辑严密,展现了卓越的工业设计水准。
6.声音设置
声音设置页面将专业级的车载音频调校与直观的交互界面深度结合,为用户打造出沉浸式的听觉盛宴。页面左上角集成的可视化声场调节图,能够让用户以拖拽方式自由定义车内音效中心,配合标准、音乐厅、演唱会等预设模式,实现了空间感的快速切换。核心的均衡器模块通过五段式滑动调节,赋予了用户对音质参数的精细把控权,而多样化的音效选项(如3D环绕声、清晰人声等)则进一步满足了不同内容场景下的个性化听觉需求。此外,系统还充分考虑了驾驶环境的特殊性,引入了“音量随速调节”功能,根据车速动态匹配音量,有效消除了环境噪音带来的听感波动。整体布局通过将基础设置、高级调优与情境功能分层呈现,不仅展现了音响系统的强大性能,更通过严谨的逻辑编排,让复杂的音频管理变得简单且充满可玩性。
7.系统设置
“系统设置”页面是整车数字座舱的后台管理中心,采用了高度模块化的设计布局,将复杂的系统维护功能梳理得条理清晰。页面左侧聚焦于基础信息与语言交互,清晰展示了操作系统版本及输入法配置,通过下拉菜单与快捷入口,让多语言环境与个性化交互设置触手可及。右上角布局了系统更新模块,配合直观的图标提示,极大降低了版本维护的感知门槛。右侧区域整合了时间日期管理与各类进阶维护工具,如存储管理、恢复出厂设置及开发者选项等,这些功能虽然专业,但通过精炼的排版,避免了对普通用户造成干扰。页面底部及右下角则贴心地设置了用户手册、服务反馈及法律法规入口,体现了系统从底层逻辑到用户服务的一体化整合思维。整体界面在严谨的工业风背景下,通过清晰的逻辑分级与交互路径规划,确保了车辆软硬件管理的安全性、易用性与扩展性,是保障座舱智能体验持续进化的基石。
四.项目开发心得
1.主题深浅切换
在界面初始化时,使用黑色作为主题风格,我们封装了底层的BGWidgetBase(展示缩放图像)、ImageLabel(展示绝对大小图像)、SvgLabel(展示不可点击的svg图像)、SvgPushButton(支持点击并且展示svg图像的按钮),作为基础组件,其他组件、面板、卡片、区域、子页面都直接或者间接继承了这些子组件,当主题切换(深浅主题切换)的时候会发射theme_changed(str)这个信号并携带者当前主题类型字符串传递到总线,所有子组件都连接到了总线上,当收到信号时,会执行各自的“handle_theme_changed”槽函数,每个函数定义了自己处理主题切换的规则,比如:BGWidgetBase里面通过查找对应的颜色图像文件实现主题切换、SvgLabel通过当前svg图像XML文件内容进行字符串替换(比如黑(#0000000)变白(#FFFFFF))实现主题切换,其他子组件的主题切换逻辑与上述大同小异,界面上的组件通过执行预设的qss实现组件样式的切换,这样就实现了以点及面的全局主题样式切换。
2.项目架构
这个系统的整体架构不算难,最耗时的地方当然是编码,其次是寻找素材,为此博主调研了多个关于“小米车机系统”网站。在代码角度我们项目代码结构清楚,通过使用多继承实现了组件复用以及样式统一,除了基础组件我们还有、个性化组件、个性面板、区域、卡片、页面、子页面,这使得我们的项目代码结构清楚一目了然,如果要在现有基础上扩展的话,上手操作也不会太困难,我们在项目代码根目录定义了main.py作为主程序的入口,直接启动主程序,启动后便可体验我们的“pyqt5小米车机系统”。
3.发布订阅模型
发布-订阅模型是一种以“事件”为中心的通信方式,核心思想是把“谁发消息”和“谁处理消息”彻底分离。发布者只负责发出事件,不关心谁会处理;订阅者只关心自己感兴趣的事件,不需要知道事件从哪里来。中间通过一个统一的事件通道进行转发,从而实现模块之间的解耦。 它的主要优点是解耦和扩展性强。系统中新增功能时,只需要新增订阅者,不需要修改原有发布逻辑,避免了代码之间的强依赖关系。同时,一个事件可以被多个模块同时监听,实现一对多通信,非常适合 UI 或复杂业务中的状态联动。 在 PyQt5 中,信号槽机制就是发布-订阅模型的典型实现。按钮点击、输入变化等行为都会以“信号”的形式发出,而槽函数通过 connect 进行订阅。当信号触发时,所有绑定的槽函数都会被自动调用,实现事件驱动编程。这种设计让界面逻辑更加清晰,也大幅降低了组件之间的耦合度。
5.关于软件开发系统的理解
在项目初期必须明确目标和核心边界,但不能过早冻结所有细节;软件开发本质是“分阶段收敛的设计过程”,通过迭代逐步逼近最终形态。 在项目立项之时就确定好“我要做什么软件”,“我的软件系统要实现哪些功能”,“软件界面是怎样的”,“软件系统的目标用户是哪些”思考完这些问题之后就可以开始搞了,思考这些问题的目的是从一开始就确定好软件系统的定位,比如一开始想做一个“和word功能和界面的软件”就不要在模仿界面的过程中裁切功能,要不然一开始就做一个“只是界面模仿word但无功能的功能系统”,千万不要因为脑子一热就确定了某个题目,回来因为功能或者界面效果无法实现就此搁浅,另外,一款稳定可靠的软件系统从一开始就要把基础打牢,把这个工程理解为“造飞机”,但是我们一上来就直接造一架飞机是不现实的,要从拧螺丝、拼装部件开始,将每一个部件、组件拼装完成,一架成型的飞机(系统)就可以起飞远航了,把开发这个软件系统堪称玩游戏一样,这样写起来就不会太累,把组件设计理解为玩”合成大西瓜“、“2048”,其实软件系统的开发就是从小到大组件化开发,就好比2048一样,先从最基础的2+2=4到1024+1024=2048一样,2和4这样的基础数字可能有多个,但是512、1024这种大数字一定是最少的,这是一个时间量变产生质变的过程。
6.多继承
在项目代码开发过程中,使用多继承的方式可以实现UI效果统一、减少重复代码撰写的效果,这里举个例子:比如我们可以封装一个基础组件类BaseWidget,继承自QWidget,初始化时包含params_init()、ui_init()、set_up_ui()、slit_init()…等基础方法,这样我们再定义同基类子组件时,就无需撰写同样的函数,直接在子组件中实现这些函数即可,我们可以在params_init()里初始化界面参数、在ui_init()的时候初始化界面组件以及布局,在set_up_ui()里面实现UI界面上的数据内容设置,在slot_init()的时候连接信号与槽,这样就实现了”一次定义,多次复用”,无论是我们维护代码还是与同事协同开发都降低了沟通频率,同时也实现了组件代码的解耦,大大提高了我们项目系统的开发效率。
下面的表格能够直观地了解到“卡片页面”的多继承关系
| 类名 | 直接父类 |
|---|---|
| Card | BaseFrame |
| BGCard | Card |
| BottomCard | Card |
| TitleCard | Card |
| CarStatusCard | BGCard |
| NavigationCard | BGCard |
| EnergyConsumptionCard | BGCard |
| RoadsideAssistanceCard | TitleCard |
| MaintenanceCard | TitleCard |
| DataPlanCard | TitleCard |
| ChargingInfoCard | TitleCard |
| CardGroup | QWidget |
| CardGroup1 | CardGroup |
| CardGroup2 | CardGroup |
| CardGroup3 | CardGroup |
7.代码量
根据不完全统计,本项目代码量为7105行,目前只统计了PyQt5代码(src/widgets/)的部分,这里主要的代码量主要源自于/src/widgets/custom_widgets.py(2968行)以及/src/widgets/custom_panels.py(1798行),这里介绍一下:custom_widgets.py主要是用于生成界面上自定义的组件,具体来说是通过调用base_widgets.py的组件基类按照需求生成个性的自定义组件,custom_panels.py是整体的面板界面文件,这里面定义了多个数据面板,面板中是自定义组件和基础组件,这里的面板主要用于生成设置界面区域。下面我们列了一个表格详细展示了src/widgets/目录下所有文件路径和代码行数:
| 文件路径 | 代码行数 |
|---|---|
| custom_widgets.py | 2968 |
| custom_panels.py | 1796 |
| custom_cards.py | 863 |
| custom_pages.py | 398 |
| base_widgets.py | 320 |
| sub_pages.py | 319 |
| custom_areas.py | 276 |
| main_page.py | 163 |
| init.py | 0 |
8.如何使用全局自定义字体
我们在资源文件中配置了小米兰亭字体,放在了:font/MiSans-Regular.ttf,在函数入口初始化,入口函数最关键的是自定义字体的加载与全局应用。程序首先通过
QApplication.setHighDpiScaleFactorRoundingPolicy以及两个Qt属性开启高 DPI 适配,保证界面在不同分辨率屏幕下保持清晰显示。随后创建QApplication实例作为整个 GUI 程序的核心事件循环载体。字体部分通过QFontDatabase.addApplicationFont(Resources.Font.MISANS)将外部字体文件动态加载到应用中,该函数返回字体 ID,用于判断是否加载成功。当返回值不为 -1 时,说明字体资源已成功注册,接着通过QFontDatabase.applicationFontFamilies(font_id)获取该字体文件中包含的字体家族名称,并取第一个作为默认字体族。之后使用app.setFont(QFont(family))将该字体设置为 QApplication 的全局字体,从而使所有未单独指定字体的控件自动应用该字体,实现统一视觉风格。最后设置Qt.AA_DontCreateNativeWidgetSiblings优化原生控件兼容性,实例化主窗口DriveSystem并进入事件循环app.exec_(),完成程序启动流程。
if__name__=='__main__':QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)app=QApplication(sys.argv)font_id=QFontDatabase.addApplicationFont(Resources.Font.MISANS)iffont_id!=-1:family=QFontDatabase.applicationFontFamilies(font_id)[0]app.setFont(QFont(family))app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)win=DriveSystem(app)win.show()sys.exit(app.exec_())9.如何使用QRC资源
首先将项目根目录/src/resource/作为资源的根目录,按照资源类型分配不同用途资源所在目录,我们设置了audio、font、image、qss四个目录,按照所属用途再次细分,比如images/目录下我们细分了apps/、bg/、icons/…等目录,这些目录会放置png、jpg或者svg的图像资源,数据文件准备好之后可以直接调用根目录/script/create_qrc.py脚本一键在资源根目录生成资源索引文件-resource.qrc,这里面是全部的资源数据路径,我们同时根据不同的业务场景在项目根目录定义了一个类“Resources”,里面按照资源用途使用前缀定义了子类、资源前缀、资源相对位置,这样我们的资源就能通过这个类进行统一管理了,虽说流程上略微繁琐,但是真正实现了业务数据的解耦,用多了就会感觉到这种方式的便利。
10.代码洁癖
不瞒大家说,博主有“代码洁癖”,具体来说是博主习惯将头部的import语句按照:系统包、(三方包)、PyQt5包、项目包的类型顺序来引入,然后同类型的包按照导入的类的字母长度进行排序,最后展示的效果就是代码类似于“金字塔”样式,这样无论是自己维护还是团队维护,只要一打开项目脚本就能一目了然地了解当前脚本的import情况,能过达到“最快的了解当前部分代码的作用”的效果。博主并不认为这是个“毛病”或者“问题”,相反我认为这是个好习惯,这样能使得接手代码的开发者能够赏心悦目地审阅代码。
11.项目所用PyQt5子类一览表
| 类名 | 父类 | 功能 |
|---|---|---|
| QApplication | QGuiApplication / QCoreApplication | Qt 应用程序入口与事件循环管理 |
| QByteArray | value type | 字节数组容器(数据处理/IO) |
| QButtonGroup | QObject | 按钮逻辑分组管理 |
| QColor | value type | 颜色表示与处理 |
| QComboBox | QWidget | 下拉选择框控件 |
| QFont | value type | 字体描述与样式配置 |
| QFontDatabase | QObject | 字体库管理与查询 |
| QFrame | QWidget | 基础容器框架控件 |
| QEasingCurve | value type | 动画缓动曲线 |
| QGridLayout | QLayout | 网格布局管理器 |
| QHBoxLayout | QBoxLayout | 水平布局管理器 |
| QIcon | value type | 图标资源封装 |
| QLabel | QWidget | 文本/图片显示控件 |
| QKeyEvent | QInputEvent / QEvent | 键盘事件 |
| QLineEdit | QWidget | 单行文本输入框 |
| QMainWindow | QWidget | 主窗口框架 |
| QMouseEvent | QInputEvent / QEvent | 鼠标事件 |
| QMessageBox | QDialog | 消息提示对话框 |
| QPainter | value type | 2D 绘图引擎 |
| QPainterPath | value type | 路径绘制与矢量图形 |
| QParallelAnimationGroup | QAnimationGroup / QObject | 并行动画管理 |
| QPixmap | QPaintDevice | 像素图(图像资源) |
| QPoint | value type | 坐标点表示 |
| QProgressBar | QWidget | 进度条控件 |
| QPropertyAnimation | QVariantAnimation / QObject | 属性动画实现 |
| QPushButton | QWidget | 按钮控件 |
| QRect | value type | 矩形区域表示 |
| QRectF | value type | 浮点矩形区域表示 |
| QScrollArea | QAbstractScrollArea / QWidget | 可滚动区域容器 |
| QSize | value type | 尺寸数据结构 |
| QSizePolicy | value type | 控件尺寸策略 |
| QSlider | QWidget | 滑动条控件 |
| QSpacerItem | QLayoutItem | 布局占位项 |
| QStackedWidget | QWidget | 多页面堆栈切换容器 |
| QSvgRenderer | QObject | SVG 矢量图渲染器 |
| QTime | value type | 时间数据结构 |
| QTimer | QObject | 定时器 |
| QVariantAnimation | QObject | 通用属性动画基类 |
| Qt | enum | Qt 枚举与全局标志 |
| QVBoxLayout | QBoxLayout | 垂直布局管理器 |
| QWidget | QObject | 所有界面控件基类 |
五.项目部署
这里介绍一下源码部署和PyCharm部署
1.源码直接部署
1. 准备项目目录
确保结构如下(关键是 main.py 在根目录):
pyqt-drive-system/ │ ├─ main.py# 入口├─ requirements.txt ├─ src/ ├─ data/ ├─ script/ └─...2.创建虚拟环境
在项目根目录打开 CMD / PowerShell:
python-mvenv venv3.激活虚拟环境
Windows:
venv\Scripts\activate成功后会看到:
(venv)4.安装依赖
你已经有 requirements.txt:
pipinstall-rrequirements.txt5.检查 PyQt5 是否正确安装
python-c"import PyQt5; print('PyQt5 OK')"6.运行项目(本机启动)
在项目根目录执行:
python main.py或在 PyCharm:
- 打开项目
- 选择解释器:
venv - 运行
main.py
2、PyCharm部署
1.设置解释器
路径:
File → Settings → Project → Python Interpreter选择:
your_project/venv/Scripts/python.exe2.运行配置
Run → Edit Configurations:
- Script path:
main.py - Working directory:项目根目录(非常重要)
- Python interpreter:venv
3、常见本机部署问题
1. ModuleNotFoundError
解决:
pipinstall-rrequirements.txt或:
pipinstallPyQt52. PyQt5插件错误(platforms)
如果报:
Could not find Qt platform plugin "windows"解决:
重新安装:
pip uninstall PyQt5 PyQt5-Qt5 PyQt5-sip pipinstallPyQt53. Working Directory 错误
现象:
- 图片加载失败
- 配置文件找不到
解决:
确保 PyCharm:
Working directory = 项目根目录4. 相对路径失效
必须统一用:
os.path.abspath(".")或封装 resource_path
4、推荐一键启动方式
你可以在根目录加一个:
start.bat
@echo off call venv\Scripts\activate python main.py pause以后双击运行即可。
5、最终本机部署总结
只需要 4 步:
python-mvenv venv venv\Scripts\activate pipinstall-rrequirements.txt python main.py六.总结
本次和大家详细分享了我使用PyQt5开发的“仿小米车机系统”,尽最大程度还原小米车机系统的UI效果,包含多个页面,支持深色浅色主题切换,本次开发在界面设计上花了很多心思,更多细节和菜单等待大家发掘!
七.扩展阅读
1.车载平板
车载平板是集娱乐、导航与车控于一体的智能终端,通常集成在中控台或后排座椅上,用于提升驾驶与乘坐体验。其核心功能之一是导航与出行辅助,可实时显示地图、路况信息、路线规划以及语音提示,帮助驾驶者高效到达目的地。同时,车载平板支持多媒体娱乐系统,包括音乐播放、在线视频、广播电台以及蓝牙投屏等,满足乘客在行车过程中的娱乐需求。在智能互联方面,它能够与手机、智能家居或云端账号连接,实现信息同步、远程控制以及个性化设置。此外,部分高端车型的车载平板还具备车辆状态监控功能,如胎压、油耗、电量、故障提示等,方便用户随时掌握车辆状况。在后排应用场景中,车载平板常用于影音娱乐、游戏、办公等,提高长途出行舒适度。一些系统还支持语音助手与手势控制,减少手动操作,提高安全性。总体来看,车载平板已从单一显示设备发展为智能车载生态的重要入口,融合了导航、娱乐、通信与车辆管理等多种能力。
2.档位
汽车档位是用于控制车辆动力传递与行驶状态的操作系统,不同动力形式的车辆结构有所差异。在传统燃油车中,常见档位包括P(驻车)、R(倒车)、N(空挡)、D(前进)以及部分车型的S或L档。驾驶者通过变速箱在不同齿轮比之间切换,以适应起步、加速、爬坡或高速巡航等工况,从而兼顾动力与燃油经济性。自动挡车型通常由变速箱自动完成换挡,而手动挡则需要驾驶者配合离合器操作。相比之下,电动车的结构更简单,一般不需要多级变速箱,多数采用单速减速机构。因此电车的档位设置更简化,常见为P、R、N、D,有些车型还提供B档(能量回收增强模式)或单踏板驾驶模式。在D档下,电机可以在宽范围内输出高扭矩,实现平顺加速,无需频繁换挡。总体来看,燃油车依赖多档位变速来匹配发动机工况,而电动车则依靠电机特性实现“少档位甚至无档位”的驾驶体验,更加简洁高效。
3.HUD
HUD(抬头显示系统)是一种将关键信息投射到驾驶员视线前方的车载显示技术,目的是让驾驶者在不低头查看仪表盘或中控屏的情况下获取信息,从而提升行车安全性。其原理通常是通过光学反射或投影装置,将车速、导航路线、限速提示、巡航状态等数据显示在前挡风玻璃或专用透明屏幕上,使信息仿佛“悬浮”在道路前方。现代HUD系统一般分为普通HUD和AR-HUD(增强现实抬头显示)。普通HUD主要以固定图标和数字形式展示信息,而AR-HUD则能够将导航箭头、车道线提示等虚拟信息与真实道路场景进行融合,提供更直观的引导效果。在实际驾驶中,例如变道、转弯或跟车时,HUD可以减少视线转移时间,提高反应速度。部分高端车型还支持与驾驶辅助系统联动,显示碰撞预警、车距提示等安全信息。总体来看,HUD不仅提升了驾驶便利性,也在智能化汽车发展中扮演着重要的安全辅助角色。
4.油车&电车
油车与电车是当前汽车动力系统的两种主要形式,各自具有不同的技术路线与使用特点。油车即燃油汽车,以汽油或柴油发动机为动力来源,通过燃料燃烧产生机械能,再经变速箱传递到车轮驱动车辆行驶。其优势在于加油补能快、续航稳定、基础设施成熟,适合长途和多场景使用,但存在排放污染、机械结构复杂、保养成本较高等问题。 电车即电动汽车,以电池组提供电能,通过电机直接驱动车轮,能量转换效率更高,结构相对简单。电车在起步加速时扭矩输出迅速,行驶过程更安静平顺,同时具备低能耗、零尾气排放的优势,更符合环保趋势。但其短板在于充电时间较长、续航受温度影响较大,以及充电设施仍在持续完善中。 总体来看,油车强调成熟可靠与补能便利,电车则突出智能化与绿色低碳。随着电池技术与充电网络的发展,电车的应用场景正在不断扩大,两者在未来较长时间内仍会并存发展。
5.汽车传感器
汽车传感器是现代车辆感知外部环境与自身状态的核心部件,相当于车辆的“感官系统”。它通过将温度、压力、位置、速度、光线、气体浓度等物理量转换为电信号,供ECU(电子控制单元)进行分析和决策,从而实现车辆的智能控制。在发动机系统中,常见的传感器包括空气流量传感器、氧传感器、曲轴位置传感器等,用于优化燃油喷射与点火时机,提高动力性能与燃油经济性。在安全系统中,ABS轮速传感器、胎压传感器以及碰撞传感器等,可以帮助车辆实现防抱死制动、胎压监测与安全气囊触发等功能。在智能驾驶领域,摄像头、毫米波雷达、超声波雷达和激光雷达等多种传感器协同工作,实现环境识别、障碍物检测与自动驾驶辅助。不同类型传感器各司其职,共同构建车辆的感知网络,使汽车具备更高的安全性、舒适性与智能化水平,是现代汽车电子控制系统不可或缺的基础组成部分。
6.空调系统
汽车空调系统是一套用于调节车内温度、湿度与空气质量的综合设备,主要由压缩机、冷凝器、蒸发器、膨胀阀以及鼓风机等部件组成。其基本工作原理是利用制冷剂在系统内循环,通过压缩、冷凝、节流和蒸发四个过程实现热量转移,从而达到制冷或制热的效果。在制冷模式下,压缩机将低温低压的制冷剂压缩为高温高压气体,经过冷凝器散热后变为液体,再通过膨胀阀降压进入蒸发器吸收车内热量,使空气降温并送入车厢。在制热模式下,燃油车通常利用发动机冷却液余热进行加热,而电动车则多采用电加热或热泵系统实现升温。现代汽车空调还集成了空气过滤、自动恒温、分区控制以及空气净化功能,可有效提升乘坐舒适性与健康水平。同时,智能空调系统能够根据车内外温度、阳光强度和乘员设定自动调节风量与温度,使车内环境保持稳定舒适,是提升驾驶体验的重要配置之一。
7.灯光系统
汽车灯光系统是保障行车安全与提升驾驶便利性的重要组成部分,主要由照明灯和信号灯两大类构成。照明灯包括近光灯、远光灯、日间行车灯以及雾灯等,用于在不同光照和天气条件下提供道路照明。近光灯适用于城市道路或会车场景,避免对来车造成眩目;远光灯则用于光线较暗且无对向车辆的道路,以获得更远的视野。雾灯在雨雾天气中具有更强的穿透力,提高可见性。 信号灯主要包括转向灯、刹车灯、示宽灯和倒车灯等,用于向其他道路参与者传递车辆行驶意图。例如转向灯用于提示变道或转弯方向,刹车灯在减速或停车时亮起以提醒后方车辆,倒车灯则在倒车时提供照明并提示行驶状态。 现代汽车灯光系统还融合了LED、激光大灯、自适应远近光以及矩阵式灯光技术,能够根据车速、方向和路况自动调整照明范围与强度,在提升安全性的同时增强智能化与美观性,使夜间驾驶更加清晰与高效。
8.刹车系统
汽车刹车系统是保障行车安全的关键装置,其作用是通过产生摩擦力或能量回收来降低车速甚至使车辆停止。传统燃油车与大多数电动车的基础制动结构相似,主要由制动踏板、制动总泵、制动油路、制动分泵以及刹车盘或刹车鼓组成。当驾驶员踩下刹车踏板时,液压系统将压力传递到各车轮制动器,使刹车片夹紧刹车盘,通过摩擦将动能转化为热能,从而实现减速或停车。 在现代汽车中,刹车系统通常与电子辅助系统结合,例如ABS防抱死系统,可防止紧急制动时车轮锁死,提高车辆操控性;EBD电子制动力分配系统可以根据车轮负载情况调整制动力,提升稳定性;ESP车身稳定系统则在车辆失控时进行主动干预。 在电动车中,刹车系统还加入了能量回收机制,通过电机反向发电将动能转化为电能储存到电池中,提高能效。总体来看,汽车刹车系统不仅负责基础制动功能,还通过电子化与智能化技术不断提升安全性能,是整车最重要的安全保障系统之一。
9.动力系统
汽车动力系统是驱动车辆行驶的核心组成部分,负责将能量转化为机械能并传递到车轮,使车辆实现起步、加速与持续行驶。传统燃油车的动力系统主要由发动机、进排气系统、燃油供给系统以及变速箱组成。发动机通过燃料燃烧产生动力,经曲轴输出扭矩,再通过变速箱调整不同速度与扭矩的匹配关系,最终传递到驱动轮。传动系统中的离合器、差速器和传动轴等部件,则用于平稳传递动力并适应不同路况。 电动车的动力系统则相对简化,核心由电池组、电机、电控系统(即“三电系统”)构成。电池提供电能,电控系统负责能量分配与控制,电机直接将电能转化为机械能驱动车轮,因此结构更紧凑、效率更高,响应也更迅速。 此外,混合动力汽车则结合了燃油发动机与电动系统,可根据行驶工况智能切换或协同工作,以实现动力与能耗的平衡。总体来看,汽车动力系统的发展正从机械驱动逐步向电气化与智能化演进,不断提升效率、性能与环保水平。
八.参考
1、小米汽车
2、小米SU7,具备科技大厂智能座舱的生态壁垒_文章_新出行
3、小米汽车的智能座舱什么水平?人车家生态能做出和别的车厂不一样的东西吗? - 知乎
4、花瓣网 - 灵感之源,花瓣之间(创意图片大全、设计灵感图库、高清图片素材)
5、小米汽车内饰全曝光!配冰箱大彩电,空间被喷“重新定义宽敞”
6、【文章】小米汽车发布澎湃OS车机版:与手机平板交互一致,开机速度超快_车家号_汽车之家