我用PyQt5手搓了一款小米车机软件系统(详细图文说明)
文章目录一前言二技术介绍1.PyQt52.QSS3.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.激活虚拟环境Windows4.安装依赖5.检查 PyQt5 是否正确安装6.运行项目本机启动2、PyCharm部署1.设置解释器2.运行配置3、常见本机部署问题1. ModuleNotFoundError2. PyQt5插件错误platforms3. Working Directory 错误4. 相对路径失效4、推荐一键启动方式start.bat5、最终本机部署总结六总结七扩展阅读1.车载平板2.档位3.HUD4.油车电车5.汽车传感器6.空调系统7.灯光系统8.刹车系统9.动力系统八参考关键字#PyQt5 #Qt框架 #PythonGUI开发 #桌面应用开发 #车机系统 #智能座舱 #小米风格UI #UI界面设计 #人机交互 #图形界面开发 #跨平台开发 #模块化设计 #多页面架构 #主题切换 #自定义控件 #界面美化#项目实战 #软件架构设计 #交互逻辑 #多媒体系统 #车辆中控系统 #智能汽车软件 #车载娱乐系统 #导航系统 #语音交互 #系统设计思路 #开发实践 #GUI框架 #界面组件 #开发教程 #图文教程 #CSDN博客 #工程化开发#界面布局设计 #软件开发学习 #Python项目实战 #UI原型设计 #智能生态 #设备互联 #Qt界面设计一前言随着智能汽车的发展车机系统已经成为连接车辆、驾驶员与智能生态的重要枢纽。从最初简单的多媒体播放到如今集导航、语音交互、车辆控制、应用生态于一体的智能座舱车机系统的复杂度和用户体验要求都在不断提升。作为一名软件开发爱好者我一直对这类大型图形化系统的架构设计和交互实现充满兴趣。在日常使用智能设备的过程中我尤其欣赏小米在人机交互设计、界面风格统一性以及设备生态联动方面的理念。当小米正式进入汽车领域后我开始思考如果完全基于 Python 和PyQt5从零开始实现一套具有“小米风格”的车机系统究竟会遇到哪些技术挑战又能够达到怎样的完成度带着这样的想法我开启了这个项目。项目并非对真实车机系统进行简单复刻而是以学习和实践为目的尝试模拟现代智能座舱的核心功能与交互逻辑。整个系统采用 PyQt5作为图形界面框架通过自定义组件、多页面架构、主题切换、模块化设计逐步构建出一个具备车机界面形态的软件系统。 一方面这个项目是对桌面 GUI开发能力的一次系统性锻炼另一方面也希望借此深入理解现代车机软件在界面设计、功能组织以及用户体验上的设计思路。本文将记录项目从构思、架构设计到功能实现的全过程并分享在开发过程中遇到的问题、解决方案以及一些技术上的思考。本次我将以图文的方式详细地介绍一款使用PyQt5开发的小米车机软件系统二技术介绍本节我将介绍本系统用到的技术1.PyQt5PyQt5 是一套基于 Qt 框架的 Python 图形界面开发库由 Riverbank Computing 提供维护。它将功能强大的 Qt C 库封装为 Python 接口使开发者能够使用 Python 快速构建跨平台桌面应用程序。PyQt5 支持 Windows、Linux 和 macOS拥有丰富的控件组件包括按钮、文本框、表格、树形视图、菜单栏、工具栏等同时支持网络通信、多线程、数据库访问、文件处理以及图形绘制等高级功能。开发者既可以通过代码动态创建界面也可以结合 Qt Designer 可视化设计工具进行界面布局再将生成的 UI 文件转换为 Python 代码使用。PyQt5 采用信号与槽Signal-Slot机制处理事件能够有效实现界面与业务逻辑的解耦提高程序的可维护性。由于其开发效率高、界面美观、生态成熟因此被广泛应用于数据分析工具、管理系统、自动化软件、科研平台以及各种企业级桌面应用开发是 Python GUI 开发领域最常用的框架之一。2.QSSQSSQt 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资源管理QRCQt 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 开发中这一功能通常通过 QSSQt 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一样先从最基础的224到102410242048一样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()的时候连接信号与槽这样就实现了”一次定义多次复用”无论是我们维护代码还是与同事协同开发都降低了沟通频率同时也实现了组件代码的解耦大大提高了我们项目系统的开发效率。下面的表格能够直观地了解到“卡片页面”的多继承关系类名直接父类CardBaseFrameBGCardCardBottomCardCardTitleCardCardCarStatusCardBGCardNavigationCardBGCardEnergyConsumptionCardBGCardRoadsideAssistanceCardTitleCardMaintenanceCardTitleCardDataPlanCardTitleCardChargingInfoCardTitleCardCardGroupQWidgetCardGroup1CardGroupCardGroup2CardGroupCardGroup3CardGroup7.代码量根据不完全统计本项目代码量为7105行目前只统计了PyQt5代码src/widgets/的部分这里主要的代码量主要源自于/src/widgets/custom_widgets.py2968行以及/src/widgets/custom_panels.py1798行这里介绍一下custom_widgets.py主要是用于生成界面上自定义的组件具体来说是通过调用base_widgets.py的组件基类按照需求生成个性的自定义组件custom_panels.py是整体的面板界面文件这里面定义了多个数据面板面板中是自定义组件和基础组件这里的面板主要用于生成设置界面区域。下面我们列了一个表格详细展示了src/widgets/目录下所有文件路径和代码行数文件路径代码行数custom_widgets.py2968custom_panels.py1796custom_cards.py863custom_pages.py398base_widgets.py320sub_pages.py319custom_areas.py276main_page.py163init.py08.如何使用全局自定义字体我们在资源文件中配置了小米兰亭字体放在了: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)appQApplication(sys.argv)font_idQFontDatabase.addApplicationFont(Resources.Font.MISANS)iffont_id!-1:familyQFontDatabase.applicationFontFamilies(font_id)[0]app.setFont(QFont(family))app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)winDriveSystem(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子类一览表类名父类功能QApplicationQGuiApplication / QCoreApplicationQt 应用程序入口与事件循环管理QByteArrayvalue type字节数组容器数据处理/IOQButtonGroupQObject按钮逻辑分组管理QColorvalue type颜色表示与处理QComboBoxQWidget下拉选择框控件QFontvalue type字体描述与样式配置QFontDatabaseQObject字体库管理与查询QFrameQWidget基础容器框架控件QEasingCurvevalue type动画缓动曲线QGridLayoutQLayout网格布局管理器QHBoxLayoutQBoxLayout水平布局管理器QIconvalue type图标资源封装QLabelQWidget文本/图片显示控件QKeyEventQInputEvent / QEvent键盘事件QLineEditQWidget单行文本输入框QMainWindowQWidget主窗口框架QMouseEventQInputEvent / QEvent鼠标事件QMessageBoxQDialog消息提示对话框QPaintervalue type2D 绘图引擎QPainterPathvalue type路径绘制与矢量图形QParallelAnimationGroupQAnimationGroup / QObject并行动画管理QPixmapQPaintDevice像素图图像资源QPointvalue type坐标点表示QProgressBarQWidget进度条控件QPropertyAnimationQVariantAnimation / QObject属性动画实现QPushButtonQWidget按钮控件QRectvalue type矩形区域表示QRectFvalue type浮点矩形区域表示QScrollAreaQAbstractScrollArea / QWidget可滚动区域容器QSizevalue type尺寸数据结构QSizePolicyvalue type控件尺寸策略QSliderQWidget滑动条控件QSpacerItemQLayoutItem布局占位项QStackedWidgetQWidget多页面堆栈切换容器QSvgRendererQObjectSVG 矢量图渲染器QTimevalue type时间数据结构QTimerQObject定时器QVariantAnimationQObject通用属性动画基类QtenumQt 枚举与全局标志QVBoxLayoutQBoxLayout垂直布局管理器QWidgetQObject所有界面控件基类五项目部署这里介绍一下源码部署和PyCharm部署1.源码直接部署1. 准备项目目录确保结构如下关键是 main.py 在根目录pyqt-drive-system/ │ ├─ main.py# 入口├─ requirements.txt ├─ src/ ├─ data/ ├─ script/ └─...2.创建虚拟环境在项目根目录打开 CMD / PowerShellpython-mvenv venv3.激活虚拟环境Windowsvenv\Scripts\activate成功后会看到(venv)4.安装依赖你已经有 requirements.txtpipinstall-rrequirements.txt5.检查 PyQt5 是否正确安装python-cimport PyQt5; print(PyQt5 OK)6.运行项目本机启动在项目根目录执行python main.py或在 PyCharm打开项目选择解释器venv运行main.py2、PyCharm部署1.设置解释器路径File → Settings → Project → Python Interpreter选择your_project/venv/Scripts/python.exe2.运行配置Run → Edit ConfigurationsScript pathmain.pyWorking directory项目根目录非常重要Python interpretervenv3、常见本机部署问题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 错误现象图片加载失败配置文件找不到解决确保 PyCharmWorking directory 项目根目录4. 相对路径失效必须统一用os.path.abspath(.)或封装 resource_path4、推荐一键启动方式你可以在根目录加一个start.batecho 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.HUDHUD抬头显示系统是一种将关键信息投射到驾驶员视线前方的车载显示技术目的是让驾驶者在不低头查看仪表盘或中控屏的情况下获取信息从而提升行车安全性。其原理通常是通过光学反射或投影装置将车速、导航路线、限速提示、巡航状态等数据显示在前挡风玻璃或专用透明屏幕上使信息仿佛“悬浮”在道路前方。现代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车机版与手机平板交互一致开机速度超快_车家号_汽车之家