news 2026/9/24 18:18:33

UE5城市交通流仿真:City Traffic Pro路网搭建与性能调优实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UE5城市交通流仿真:City Traffic Pro路网搭建与性能调优实战

1. 为什么我会在项目里选择City Traffic Pro而不是手写交通流

先说结论:如果你只是做一个路口动画演示,那手写几辆车的样条线移动完全够用;但如果你要做的是城市级场景、需要让NPC车辆自己绕路、等红灯、变道、避让玩家,那手动的成本会迅速失控。

我这次的场景是UE5.3,一片大概1.2km x 1.2km的城区地块,包含8个主要路口、双向四车道主路和若干支路。初期我尝试过用Spline plus 定时器自己做“假交通”,结果遇到几个绕不开的问题:

  • 车辆永远沿着固定轨迹跑,玩家一挡路就穿模;
  • 多个路口交汇处车辆互相穿插,毫无秩序;
  • 想加红绿灯逻辑,得自己维护一套状态机,工作量剧增;
  • 后期加了行人后就彻底乱了,车辆完全不看人。

City Traffic Pro(以下简称CTP)的价值在于它把“路网识别—路径规划—跟车逻辑—交通规则—AI避让”这一整套东西打包好了。它不是单纯让你摆几辆车在路面上跑,而是提供了一套“交通仿真层”。你只需要把Spline路网整理好、设置好路口连接,它就能自动跑起来。

还有个更现实的理由:团队里不一定每个人都有能力手写避障算法。CTP的起点足够低,美术和策划也能上手,程序员只需要负责跟它对接事件接口。对于一个需要快速出效果的中小型项目来说,这种“让非程序也能布置交通”的能力非常值钱。

提示:CTP的官方定位是“程序化交通流解决方案”,它对路网的依赖远大于对车辆模型的依赖。也就是说,车辆模型反而是最好替换的部分,路网Spline才是整个插件的灵魂。

当然它也有学习成本,不是装上就能秒出效果。需要在Spline路网上做不少规范化工作,尤其是路口切割、连接器生成、车道方向标记这几步,前期做不好,后面跑起来就是车祸现场。这篇文章就是我踩完这些坑之后整理出来的完整笔记,从安装到实战配置再到性能调优,一次说清楚。

2. 路网搭建是整个插件的地基:从Spline操作到路口生成

CTP和很多交通插件一样,核心思路是“路径即路网”。所有车辆都沿着Spline定义的路径行驶,车辆的行为差异来自路径的拓扑关系——哪里能转弯、哪里能变道、哪里是路口——都由Spline之间如何衔接来决定。所以第一步永远不是拖入车辆,而是把路网撸干净。

2.1 Spline路网的正确画法

打开插件后,菜单栏多出 City Traffic 相关的编辑器工具。我用的是 5.3 对应版本,界面和部分老版本有差异,但核心逻辑一致。

建路网的第一步是在关卡里新建一个 Actor,挂载 CTP 的路网组件(通常叫做 TrafficSplineRoad 或类似名称)。然后进入 Spline 编辑模式,沿着道路中心线打点。

画线时一定要遵守三条铁律:

  1. 每条道路必须是独立的一条Spline,不要把一条长路从头画到尾然后跨路口,每个路口都要断开。
  2. Spline的起点和终点方向必须和道路行车方向一致,否则车辆会逆行或者出现奇怪的掉头行为。
  3. 路口处Spline的末端必须延伸到路口中心附近,留出足够的连接范围,这样生成路口连接器时才不会出现悬空断点。

我第一次画的时候就吃了大亏:一条接近2公里的主干道,我图省事用了一段连续Spline,结果到路口之后车辆完全不知道该往哪拐。后来才意识到,CTP识别路口的方式是靠两条Spline的端点接近程度,你必须让它们在空间上足够近、并且方向正确,系统才能生成出连接关系。

2.2 路口切割与连接器生成的关键逻辑

路网画完后,接下来要做的不是急着加车,而是执行CTP的“路口生成/刷新”功能。这个操作会扫描场景中所有TrafficSplineRoad的端点,把端点距离小于设定阈值的区域判定为一个路口,然后自动生成连接器(Connector)。

连接器是什么?你可以把它想象成道路之间的“虚拟匝道”——它规定了从A路右转进入B路时车辆走的曲线路径。CTP的路径规划本质上是在这些连接器之间做搜索,车辆只是沿着选定的连接器序列移动。

实操中需要注意几个参数:

  • 路口检测半径:我一般设置为300~500厘米,具体取决于路口大小。太大会把两条平行路也误判成交叉路口,太小则识别不出转弯关系。
  • 路口连接器数量:CTP通常会在一个路口自动生成所有可能的转弯组合。四向路口会有直行、左转、右转、掉头等组合,细节取决于你路口切割后每条路端点的位置和方向。
  • 红绿灯节点:CTP允许为路口挂载红绿灯Actor,挂载后车辆就会按照信号灯状态决定是否通过路口。

这块是插件的核心能力,也是最容易出问题的地方。我的建议是:在生成连接器之后,逐路口检查一下连接器的预览箭头方向,确认左转、右转、直行的路径线都正确。一旦发现某条转弯路径穿过了建筑物或反向道路,需要用切割位置或Spline控制点去修正,而不是去改连接器。

注意:CTP的连接器只在编辑器里生成并缓存,运行时会根据你的构建选项来决定是否重新生成。如果你改了路网却在运行时发现还是旧路线,先检查是否没有执行“刷新路网”操作。

3. 车辆配置与AI控制器:把静态模型变成会思考的交通流

路网搞定后,下一步才是把车辆放进去。CTP并不强制你使用特定车型,你可以用任何带骨骼或非骨骼的静态网格体来当车辆,只要给它挂载对应的Vehicle组件并设置好参数。

3.1 车辆Actor的组件结构

一个能接入CTP的车辆Actor,通常由以下部分组成:

组件作用备注
StaticMesh / SkeletalMesh车身外观低模优先,性能关键
CTP Vehicle Movement Component车辆运动逻辑核心,负责速度/转向/碰撞
CTP Vehicle AI Controller驾驶行为路径选择、跟车、路口决策
碰撞盒物理碰撞通常用Box Collision

在车辆蓝图里,最重要的一步是把Vehicle Movement ComponentAI Controller关联起来。很多新手在这一步会漏掉,结果就是车辆被摆进场景里但完全不动,或者动了但完全无视红绿灯。

我的配置顺序大概是:

  1. 先创建蓝图类,父类选择CTP提供的VehicleBase(如果有的话)。
  2. 调整车身StaticMesh,并把碰撞盒贴合车身大小。
  3. 在类默认值里指定AI Controller类型为CTP的VehicleAIController。
  4. 调整运动组件里的最大速度、加速度、转向灵敏度等参数。
  5. 在关卡中放置若干车辆,调整初始位置到车道起始点附近。

3.2 为什么推荐用“路径点+样条速度曲线”而不是直接调速度

CTP的AI车辆在宏观上是沿着Spline连接器网络走的,但微观上它会根据前车距离、路口情况、红绿灯状态实时改变速度。这个“微观跟车逻辑”是CTP最值钱的部分之一。

如果你做过简单的车辆跟随,大概会知道一个基础公式:

理想车距 = 当前车速 × 反应时间 + 最小安全距离

CTP里的跟车逻辑虽然不完全是这么简单,但思想一致:它会在每一帧计算与前车的间距,如果间距过小就减速,如果前方畅通就加速到道路允许的限速。同时它还会对路口的连接器预判——如果前方路口是红灯且自己排在第一位,它会在停止线前逐步减速而非急刹。

这里有个重要参数:反应时间因子(或者叫跟车灵敏度)。默认值往往偏保守,跑起来车队会很拖沓。我在城市主干道上会稍微调大一点,让车辆更紧凑地跟着前车走;但在小区的狭窄通道里必须调小,否则会频繁刹车。

经验值参考:主干道跟车距离因子 0.8~1.0,狭窄区域 1.2~1.5,具体数值还要看你场景里车辆模型的尺寸,模型长3米和9米的卡车,用的安全距离肯定不一样。

3.3 让车辆“看起来有人开”:转向灯、制动灯与随机驾驶风格

CTP的AI是能输出一些事件和状态值的,比如当前是否在转弯、是否在刹车、当前转向方向等。把这些接到车身的灯光和动画上,交通的真实感会立刻提升一个档次。

我是这样处理的:

  • 转向灯:利用AI控制器的转向信号事件,在转弯前3米开启对应方向的转向灯,转完立刻关闭。延迟时间可以微调,太早开启会显得假,太晚又起不到警示效果。
  • 制动灯:直接绑定运动组件的加速度值,当加速度为负且绝对值超过阈值时点亮。
  • 随机驾驶风格:给每辆车的AI控制器生成一个随机种子,影响它的最大巡航速度偏移、变道倾向、跟车激进程度。这样一来,就算所有车辆共用同一条路网,看起来也不是一队复制人。
// 伪代码示例:根据随机种子微调驾驶风格 float Seed = FMath::RandRange(0.0f, 1.0f); MaxSpeedOffset = FMath::Lerp(-0.1f, 0.15f, Seed); LaneChangeBias = FMath::Lerp(0.2f, 0.9f, Seed); AggressionFactor = FMath::Lerp(0.5f, 1.2f, Seed);

这段逻辑不要写在Tick里,因为不需要每帧都变一次随机值。我一般是在车辆初始化时生成一次,然后保存在控制器中,之后所有跟车、变道计算都引用这些值。

4. 红绿灯与路口管制:让交通流真正有序运转的关键

从“车辆会跑”到“交通有序”,中间的跨越就是信号灯逻辑。CTP把路口控制做得比我预想的更灵活,你既可以给它指定一个全自动的信号灯Actor,也可以用蓝图手动控制信号灯状态。

4.1 信号灯Actor的挂载与相位设置

在CTP的路口生成之后,你会在路口中心附近放置一个TrafficLightActor,然后把它关联到刚才生成的路口上。关联之后,这个Actor就拥有了对这个路口所有连接器的控制权。

接下来的核心操作是设置“相位”(Phase)。一个简单的十字路口通常有:

  • 相位A:南北向直行+右转;
  • 相位B:南北向左转;
  • 相位C:东西向直行+右转;
  • 相位D:东西向左转。

每个相位里,你要指定哪些连接器是“可通行”的。CTP会在运行时根据信号灯状态决定车辆能否进入这些连接器。否则车辆就会“看”不到红灯,直接冲过去。

我的建议是:先从最简单的“两相位”开始验证路网和信号灯逻辑是否正常工作(即东西直行/左转全放行,然后南北直行/左转全放行),确认无误后再拆分成多相位。直接上四相位经常会出现某个方向的车永远在等待的“死锁”问题——根因通常是某个连接器在相位分配时被漏掉了。

4.2 信号灯与车辆减速停止点的配合

CTP的车辆不会在红绿灯Actor的位置才减速,它会在进入路口前的某段距离内提前判断信号灯状态并开始刹车。这个“提前判断距离”是由你路网上标记的停止线位置决定的。

在每一条进入路口的Spline末端附近,你需要手动放置一个“停止线标记”(Stop Line Marker),并关联到路口的对应入口。这样一来车辆就有了明确的停车参考点。如果这一步不做,你可能会看到车辆冲过人行横道才急停,非常不真实。

停止线的放置经验:

  • 距离路口中心大约半个车身到一整个车身的距离(3~5米)比较合理;
  • 停止线必须垂直于行车方向,否则车辆斜着停;
  • 每个入口只需要一个停止线标记,四个方向入口就是四个。

4.3 多路口联动与绿波带尝试

当你完成了单个路口的信号灯设置后,可能会想让多个路口之间产生配合,比如主干道的“绿波带”。CTP允许你在蓝图里写全局控制逻辑,我认为这是它比许多传统交通插件更开放的地方。

我在项目中做了一版简单的绿波带实验:主干道上的四个连续路口,信号周期统一为60秒,南北向相位错开15秒启动,模拟车辆一路绿灯通过的效果。实测下来,效果比想象中好,但有一个前提——每个路口的连接器拓扑必须完全一致,否则相位错开之后某个车辆会在中间路口找不到路径而原地等待。

这里要提醒一下:绿波带的全局控制器最好是放在GameMode或一个独立的交通管理器Actor里,不要在关卡蓝图的Tick里每帧遍历所有路口。性能压力太大,而且逻辑混乱后极难调试。

5. 行人、玩家交互与特殊事件:交通插件不只是“车跑起来”

到这一步,基础的车辆交通流已经能正常运作了。但一个城市级场景真正让人感觉“活”起来,靠的不只是车流,还有车与行人、车与玩家的互动。CTP对这部分没有做成完全自动,而是给了一组事件和接口,需要我们自己接。

5.1 车辆避让行人的实现思路

先说结论:CTP默认是“想看行人但不会主动避让”的。它更多关注车辆之间的交互,而行人则是通过检测碰撞盒来触发车辆刹车。

我用的方案是给行人角色一个专门的碰撞通道(比如Pawn通道),然后在CTP车辆运动组件里设置对该通道的响应为“阻挡”。当行人站在车前时,车辆会检测到碰撞并为避免重叠而停下来。

这个方案唯一的缺点是:所有车辆都会对行人“过度反应”,哪怕行人只是站在路边两米外,只要碰撞盒碰到道路边界,车也会停。所以建议行人碰撞盒调小一点,或者只给行走中的行人启用碰撞,站定后切换为Overlap,避免车流被路边聊天NPC反复打断。

注意:如果场景里行人数量很多(比如超过20个活跃AI),我给的建议是不要用物理碰撞做避让,而是用“前方检测射线+行人查询”的方式,让车辆只对前方5~8米范围内的行人响应。性能更好,行为也更自然。

5.2 玩家车辆混入AI车流

如果你的项目里有玩家驾驶的载具(比如用UE5自带的Vehicle或WheeledVehicle),CTP同样能处理。做法是把AI交通车辆和玩家车辆放到同一个碰撞通道里,然后让CTP的AI车对玩家车辆进行“前车检测”即可。

我踩过一个大坑:玩家车辆没有正确设置VehicleMovementComponent的碰撞响应,导致AI车辆在接触玩家车辆时不是减速,而是直接弹开。后来发现是碰撞盒的响应通道设成了BlockAll,导致物理引擎直接把两辆车推开。

正确做法是:AI车对玩家车的通道响应设为“Overlap”或使用CTP提供的查询接口来检测距离,而不是当物理碰撞来硬顶。这样AI车会平滑减速并跟随玩家车,而不是发生物理弹跳。

5.3 特殊事件:封路、事故与临时改道

CTP允许你在运行时动态启用/禁用连接器。这能力特别适合做三种玩法:

  • 封路事件:把某条路段的连接器禁用,车辆会立刻重新规划路径,绕到其他可通行的连接器上;
  • 事故遮挡:在某条车道上放一个静态障碍物,CTP不能直接识别障碍物,但你可以检测到车辆在该区域频繁急刹后,手动禁用相邻连接器;
  • 车队开道:让某条路上的所有车辆在几秒内靠边停让,这可以通过广播事件让AI车辆暂停并切换到路肩路径实现。

实际做的时候有一个关键点:禁用连接器之后,已经在路径上行驶的车辆不会立刻“掉头”或瞬移,它只会放弃还没走的下一段连接器。所以封路后你会发现车辆堆积在路口附近,需要过一小段时间才会逐渐消散。这个时间取决于路径重新规划的频率,我把CTP的路径重规划间隔从默认的2.0秒调到了1.2秒,车辆绕行响应快了不少。

6. 性能调优:从60辆车卡成PPT到140辆车稳定运行

我第一版测试时,大概在场景里放了120辆车,结果编辑器里直接掉到20多帧。一开始以为是车辆模型面数太高,后来逐项排查才发现,最大的瓶颈根本不是渲染——是AI更新频率和碰撞查询次数。

6.1 AI更新频率的分层优化

CTP支持设置AI更新频率。最直观的做法是把远处车辆的路口决策和跟车计算频率降低,比如30米内每帧更新,30米外每两帧更新一次,100米外每四帧更新一次。

这个方案在蓝图里的实现方式并不复杂,但注意事项是Dithger——更新频率切换时,车辆速度和方向不要突变,否则会出现肉眼可见的卡顿。我建议在做频率切换时用插值过渡,不要直接赋新值。

另外,如果你的场景视野很开阔(比如航拍视角),即使距离很远玩家也能看到车辆。这时如果完全停止远处车辆的AI更新,车辆会停在路中间不动,反而穿帮。所以远距离更新的正确做法是“降频但不停更”,哪怕3帧更新一次,也要让车辆慢慢往前挪。

6.2 碰撞查询消耗的主要来源

CTP的跟车和避障依赖大量的射线检测或Overlap查询。当车辆密度上升时,这部分CPU消耗会指数级上升。

我的优化办法是:

  • 开启空间划分:让CTP使用Unreal Engine自带的空间Hash或Octree来加速邻居查询。这个选项一般藏在项目设置里的CTP分类下,开启后查询次数能下降一半以上。
  • 减小查询半径:默认的检测距离可能覆盖前后100米范围,在城市道路里根本用不到那么远,我缩短到40米,跟车和变道的性能消耗立刻降了一截。
  • 分层碰撞:只让同车道或邻近车道的车参与碰撞检测,远处车辆只做“存在性确认”,不做精细的间距计算。

6.3 车辆模型与动画的轻量化

既然流程走到了性能调优,车辆模型也得一并处理。建议把蚂蚁似的轮子模型从4万面降到8千面以下,外观贴图用一张512的Texture Atlas。CTP并不需要轮子单独做物理仿真,只是视觉交互,所以能省就省。

我还做了LOD(Level of Detail)优化:近处车辆显示完整模型,100米外切换为低模,200米外直接换成带贴图的Billboard或只显示车顶快照。从视觉上看,远处车辆本来就很难看清细节,牺牲一点模型精度换性能非常值得。

最终我的场景里跑140辆车时,GameThread耗时大约从8ms降到了5.5ms,主要就是靠以上三招。

注意:如果你项目里打开的是“编辑器PIE”测试,编辑器开销会比Standalone高很多。性能测试尽量用 Standalone 模式或打包后的版本,数据才真实。

7. 踩坑记录:那些文档没写但你一定会遇到的问题

这部分是我在实际使用CTP时踩过最深、也最花时间排查的几个坑,写出来帮你少走弯路。

7.1 连接器生成后车辆在路口原地打转

表现:车辆到达路口后,像鬼打墙一样反复往前冲又折回,但始终不转弯。

排查链路:

  1. 打开CTP的调试绘制(Debug Draw),查看路口区域的连接器路径是否有部分被建筑或路沿石遮挡。
  2. 检查连接器的起点/终点方向是否与对应Spline端点方向一致。如果某条连接器的Yaw角反了,车辆会认为那条路无效,反复尝试其他连接器,最终回退到原来的路径上。
  3. 手动用编辑器“测试路径”功能,从入口到出口走一遍,看是哪一段路径规划失败。

最终我遇到的原因是路口切割时,两条Spline的末端重叠部分过多,导致连接器生成在重叠区域内,起点和终点指向了同一个方向。解决办法是把路口的Spline末端缩短到路口边缘,而不是伸进路口中心太远。

7.2 所有车辆挤在同一条车道,不肯变道

CTP默认的变道逻辑是保守的,只有当左侧或右侧车道明显更快时才会触发变道,大部分情况下它宁愿跟着前车排队也不乱变。这是一种很真实的驾驶行为,但如果你希望看到更“激进”的城市车流,需要调整AI控制器里的变道倾向因子和相关阈值。

另外一个可能的根因:路网本身没有为每个方向建设独立的行车路径。如果你把双向四车道画成了两条Spline,其中一条还双向复用,那车辆不会自动“变道”到另一条,因为它认为那是对向车道。正确做法是双向四车道至少画4条独立的偏移Spline,并为每条指定方向。

7.3 保存关卡后连接器数据丢失

这个坑比较隐蔽。CTP的连接器可以在编辑器里生成并缓存,但如果你修改了路网Spline的Control Point位置,而连接器没有被标记为“脏”状态,那么生成器可能不会自动刷新。

我建议养成一个习惯:每次修改任何Spline路网节点后,统一执行一次“重新生成所有连接器+全量刷新路网”的操作。虽然会花掉几秒钟,但能避免很多运行时才暴露的奇怪行为,比如某些路口无响应、车辆突然消失等。

7.4 车辆轮胎不转、车辆看起来像幻灯片

如果你用了SkeletalMesh车辆并且想让轮胎旋转,CTP本身不管这个,它只负责移动车身。你需要自己根据车辆移动速度计算轮胎转动角速度,并驱动骨骼。

我在测试时发现,如果车速超过一定值,轮胎转速会过高,看起来像是在疯狂空转。后来做了一步平滑:不对速度直接取反,而是用当前轮胎角速度朝向目标角速度做插值,效果真实多了。

8. 从CTP出发的更多玩法:动态交通流、事件系统和二次开发方向

如果基础功能都已经跑通,这篇文章的末尾我想留几个可以继续深挖的方向。

动态车流密度:通过一个全局“时间因子”,在早高峰、午间、夜晚三个不同时段切换车辆生成数量和AI更新频率。实现上可以用GameMode或自定义Volume来控制,配合DayNight循环,能让城市节奏感非常强烈。

事件系统对接:把CTP的行车事件(进入路口、停车、前方障碍)抛给任务系统,比如设计一个“护送VIP车辆”的任务,当玩家车辆被AI交通逼停时,任务NPC会发出超车指令。

二次开发方向:CTP虽然已经提供了AI控制器,但如果你有更强的算法需求(比如强化学习训练车辆停车决策),可以考虑重写或继承它的AI Controller,在保留跟车逻辑的前提下,替换掉路口决策部分。因为CTP已经把路网、连接器、信号灯这些底层数据结构暴露出来了,这点改造空间还是很大的。

我见过有人把它用来做数字孪生路口的测试平台,也有人拿它做自动驾驶模拟的前期验证,还有人只是想要一个能拍出好看城市空镜的“背景车流”。同一套路网逻辑,不同项目完全可以根据自己的目标做取舍。

最后说一句实际感受:CTP不是一个“开箱即用、啥都不用管”的插件,但只要你在Spline路网和路口拓扑上多花些心思,它的上限很高,玩熟练了以后做城市类项目几乎离不开它。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 18:18:27

CNN+LSTM流量分析识别:pcap切流、特征化与部署避坑指南

简介:基于CNN与LSTM的流量分析识别系统设计与实现资料包,面向深度学习、人工智能方向的学生、研究者和网络安全分析人员,用于解决网络流量的实时识别与分类问题。方案采用CNN提取空间特征、LSTM提取时序特征,将思博伦官方pcap包解…

作者头像 李华
网站建设 2026/9/24 18:17:39

阿尔兹海默症多模态诊断模型:ResNet+CBAM+跨模态注意力实战

简介:本资源是一套完整的毕业设计项目,聚焦基于多模态融合的阿尔兹海默症智能诊断方法,面向计算机、人工智能、生物医学工程等专业的本科生与研究生,也适用于教师教学参考及企业初阶算法实践。项目以Python实现,涵盖数…

作者头像 李华
网站建设 2026/9/24 18:17:36

Codex和Claude Code虽强,但跨设备工作台才是补上最后一公里的关键

最近有件事让我特别有感触:我同时在用 Codex 和 Claude Code 做项目,前者擅长批量改老代码、处理重构,后者写测试和搭原型很顺手。工具本身是真强,但用着用着我发现一个很尴尬的场景——在公司电脑上跑了一下午的调试思路、已经和…

作者头像 李华
网站建设 2026/9/24 18:17:35

WinForm自绘曲线游标:ZedGraph实现毫秒级数据点吸附

简介:本资源是一份面向C# WinForm开发者的技术实践项目,聚焦于自定义图表交互功能的实现,解决非Chart控件下鼠标悬停定位、最近数据点计算与动态游标绘制等核心问题,适用于需深度定制图表交互的企业级桌面应用开发场景。压缩包共5…

作者头像 李华
网站建设 2026/9/24 18:17:10

基于Python卷积神经网络CNN图像分类系统源码解析与实战

简介:这份资源面向计算机相关专业的本科毕业生及需要完成课程设计的学生,提供一套基于Python卷积神经网络CNN的图像分类系统完整实现方案,帮助解决毕业设计选题难、代码跑不通、文档不齐全等常见问题。压缩包共21个文件,约62KB&am…

作者头像 李华
网站建设 2026/9/24 18:16:48

Qt读XML文件的步骤

Qt写XML文件的步骤 1、基本使用方法 // 头文件 #include <QDebug> #include <QFile> #include <QIODevice> #include <QString> #include <QXmlStreamReader> #include <QXmlStreamAttribute> #include <QXmlStreamAttributes>#de…

作者头像 李华