跨平台桌面开发选型:Avalonia UI 与 Qt 的架构、渲染与生态对比

发布时间:2026/9/8 17:32:28
跨平台桌面开发选型:Avalonia UI 与 Qt 的架构、渲染与生态对比 引子一场桌面开发选型里的“老钱”与“新贵”之争做跨平台桌面应用的人近几年肯定绕不过一个话题为什么有了 C 和 Qt还有人要搞一个 Avalonia UI 出来是不是重复造轮子还是说里面另有门道我自己的感受是Avalonia UI 和 Qt 的差异表面上是一套 C# 界面框架与一套 C 界面框架的差异但再往里看它们背后是两套完全不同的演进逻辑。Qt 从 1995 年出生到现在走过来的是“C 原生渐进式适配”的路线积累了非常多工业级控件库和工具链但也被 C 的语言包袱和历史兼容性拖住了不少。Avalonia 则是从 WPF 的思维出发借着 .NET 跨平台能力和 Skia 渲染引擎重新定义了“XAML 一次编写、多端渲染”这件事。这篇文章不是要吹一个踩一个。我两种框架都用过Qt 从 5.15 一路用到 6.5Avalonia 也完整做过两个中大型桌面项目。我会从演进逻辑、渲染模型、UI 架构、生态工具链、踩坑实录几个维度把这两套东西放在同一张手术台上解剖一遍。选型之前你至少得知道每一个“漂亮表面”背后藏了多少工程成本。1. 演进逻辑为什么一个老牌霸主会被“重新发明”1.1 Avalonia 的诞生本质是对 WPF 的一次“跨平台越狱”很多人第一次看到 Avalonia第一反应是“这不就是 WPF 搬到 Linux 上吗”。这个说法对了一半。Avalonia 确实沿用了 XAML 描述界面、数据绑定、通知机制这些非常成熟的 WPF 理念但它的底层架构并不是拿 Mono 把 WPF 模拟一遍而是用 Skia 作为渲染后端直接自己去绘制每一个控件。这带来一个很关键的区别Avalonia 控件不是映射到操作系统原生控件而是完完全全自己画出来的。这意味着同一个按钮在 Windows、macOS、Linux 上看到的几乎是一模一样的像素。我没有夸张它连滚动条滑块的高光渐变、阴影半径这类细节都是自己控制的不会因为换了操作系统就变成另一套风格。从演进逻辑上看Avalonia 其实是很典型的技术“越狱”。WPF 强在开发效率和灵活渲染但受制于 .NET Framework 和 Windows 平台Qt 强在成熟稳重但如果你用惯了 WPF 的 XAML、绑定、样式系统转到 Qt Widgets 会感觉从 2020 年代退回 2005 年。Avalonia 的诞生正是把 WPF 这套开发范式从 Windows 的锁链里拎出来放到全平台环境里重新长一遍。1.2 Qt 的演进逻辑在 C 里不断做“现代化缝合”Qt 的演进逻辑和 Avalonia 完全不同。它在 1995 年诞生时目标就是“跨平台 C 界面库”那个年代的方案是抽象层加宏加信号槽。后来随着桌面环境发展Qt 从 QWidget 这套经典控件模型扩展出 QML、Qt Quick、Qt Quick Controls再到 3D、多媒体、网络、串口、自动化、图表等大量工业级模块。表面看 Qt 是一个 UI 库实际上它更像一个“带界面的 C 操作系统级工具包”。它的演进重心一直放在“哪些底层能力我还能收进来”而不是“渲染范式是否统一”。比如 Qt 中同时存在两套完全不同的 UI 开发模型QWidget 走的是传统控件 布局 事件循环QML 走的是声明式界面 JavaScript 逻辑 场景树渲染。这两套东西风格差异大学习成本高但 Qt 只能一起维护着因为存量用户太多不敢砍。这种“缝合式演进”带来的好处是没有历史包袱的新用户可以选择 QML 这种更现代的方案坏处是框架自身的割裂感长期存在。你做一个复杂桌面软件团队里有人用 QWidget 写模块有人用 QML 做界面两边交互和线程模型还不太一样调试起来真的会怀疑人生。1.3 定位差异一个是 UI 框架一个是“C 工业工具箱”我越来越觉得把 Avalonia UI 和 Qt 放在同一维度比较本身就不太公平。Avalonia 核心解决的是“界面、交互、绑定、样式”这件事它周围的生态是 .NET 的你要序列化、数据库、HTTP 请求可以找 Newtonsoft.Json、EF Core、HttpClient这些是独立的 .NET 库不是 Avalonia 的一部分。而 Qt 则走的是“全家桶”路线。从 QSerialPort 串口通讯、QNetworkAccessManager 网络请求、QProcess 外部进程管理再到 QCustomPlot 图表绘制、QOpenGLWidget 3D 渲染Qt 官方和第三方生态都给得很全。很多 Qt 项目里界面的代码可能只占一小部分大量逻辑是直接调 Qt 的底层能力在跑。所以选型时如果问“Avalonia 能替代 Qt 吗”我的回答通常是如果你只把 Qt 当 UI 框架用那 Avalonia 完全可以替代但如果你把 Qt 当一套贯穿硬件通讯、算法处理、界面显示、多线程任务编排的“C 工作台”那 Avalonia 只是一个界面层你要自己把另一半技术栈拼起来。2. 渲染真相控件到底是谁画出来的决定了你调优的上限2.1 QWidget 的“伪原生”与 QML 的“全自绘”我用 Qt 的时候经常被它的渲染模型搞糊涂。QWidget 的按钮、输入框、下拉框在不同平台上确实会表现出一些原生观感但这并不是因为 Qt 去调了 Windows 或 Linux 的原生控件 API而是因为它自己内置了不同平台的主题样式拿着平台的主题参数用 QStyle 在自身上绘制出来。这种方式的优点是观感贴近原生能和系统主题风格做一定程度适配代价是控件的“可塑性”受限你想做一个特别大胆的自定义样式比如不规则按钮、复杂内阴影、非线性动画就得绕开 QStyle 自己重写绘图事件硬画。QML 则走向了另一个方向。它天然就是自绘的场景树里的每个项目最终都会被渲染到 OpenGL 或者 RHI 图形栈上。所以 QML 制作酷炫界面、流畅动画、毛玻璃效果很顺手这也是很多 Qt 新项目选择 QML 的原因。但 QML 的问题是一旦交互逻辑复杂起来JavaScript 代码散落得厉害后期维护时经常出现“渲染没问题、数据状态不知道谁改坏”的尴尬局面。2.2 Avalonia 的渲染管线其实就是一套完整的 Skia 绘制引擎Avalonia 更偏激它把所有控件全部自己画底层直接挂在 Skia 引擎上。Skia 是 Google 开源的高性能 2D 图形库Chrome、Flutter 都在用。这套东西的渲染能力非常强先构建一张可视元素树然后按样式和布局进行布局计算、变换、裁剪、图层合成再交给 GPU 或 CPU 完成绘制。这意味着 Avalonia 的界面渲染流程本质上和 Chrome 浏览器渲染一个网页非常像。它有一套自己的“排版引擎”。所以你在 Avalonia 里做一个控件不是在调用某个系统控件而是在定义这个控件的“绘制指令”角度、阴影、路径、动画全部由自己掌控。你可以在 Avalonia 里做到任何 Skia 支持得起的视觉效果自由度比 QWidget 高一个量级比 QML 也更底层一些。代价是Avalonia 需要自己处理文本排版、字体回退、输入法、辅助功能这些平台能力。做中英文混排、阿拉伯语 RTL、东亚输入法时Avalonia 的成熟度还达不到 Qt 那种十年磨一剑的水平。我在做国际化项目时就踩过中文输入法候选框定位的坑某些 Linux 发行版上输入法窗口和光标位置对不上改起来非常折腾。2.3 表格对比渲染模型对开发体验的影响为了讲得直观我把两边的渲染模型差异整理成一张表格对比项Qt WidgetsQt Quick / QMLAvalonia UI渲染方式QStyle 自绘模拟原生场景树 独立渲染后端Skia 全自绘界面定制自由度低需重写 QStyle中高需要理解场景树极高直接面对绘制指令动画能力一般需要手动计时器不错Transition 机制强属性动画和自定义渲染原生观感较好贴近系统主题一般需要自己模仿统一风格不跟随系统学习曲线平缓“传统桌面开发思维”陡峭声明式 JS如果你会 WPF 则非常轻松底层可调性一般较强强可自由介入绘制层选哪套渲染模型不要只看官网 Demo要看你团队的背景。如果团队全是从 C MFC 时代过来的人QWidget 是舒适区如果团队主要写 C#Avalonia 的学习成本远比 Qt 低如果要做大屏可视化、工业 HMI 这种需要大量动画的界面QML 是一把好手但 Avalonia 做到复杂数据可视化时也不弱毕竟 Skia 本身能力足够。3. 生态、工具链和“看似免费”的隐藏成本3.1 Qt 的生态像一棵老树根系里全是“实战模块”我不光把 Qt 当 UI 框架更多时候是当工具库。常用 Qt 的人会知道热词搜索里那些高频问题几乎都是 Qt 生态能力的体现。比如Qt 串口编程QSerialPort 做工业设备通讯太方便了扫一遍 COM 口列表、设置波特率、监听 readyRead一个能用的串口调试助手半小时写出来。QCustomPlot 时域图转频域图绘图库做的很成熟配合 kissfft 这类 FFT 算法库实时展示频谱波形不是难事。Qt 多线程QThread、QtConcurrent、信号槽跨线程投递这套线程模型比手写 std::thread 加锁要安全多少倍用过的都知道。Qt 翻译tr() 宏配合 Qt Linguist做多语言界面是真的顺手词条提取、翻译、加载语言包都有工具链支撑。Qt 崩溃和调试Breakpad 接入、qInstallMessageHandler、QCoreApplication 事件循环机制社区里大把现成方案。当你需要这些非 UI 能力的时候Qt 的“全家桶”价值就体现出来了。你不用到处拼第三方库一个 QSerialPort 就把硬件的烂摊子收拾了。这也是为什么很多工控、医疗、自动化设备软件至今仍坚定站在 Qt 这边。Avalonia 的生态刚刚过了“能用”阶段距离“好用”还有不小距离。它作为纯 UI 框架必须依赖 .NET 生态的东西调用串口需要用 System.IO.Ports做图表可以找 LiveCharts2 或 ScottPlot写网络请求用 HttpClient。这些库本身质量很好但它们不是为 Avalonia“定制”的使用时要自己做适配尤其是数据绑定到界面层时API 风格并不统一。另外 Qt 还有一个难以替代的优势Qt Creator 和 qmake/CMake 这一套构建和调试体验在 C 桌面项目里是打磨得很顺的。配合官方文档、示例、Stack Overflow 上十几年积累的答案你能在工作中快速解决 90% 的问题。而 Avalonia 的问题往往太新踩到坑时连搜索引擎都找不到几条对得上的解决方案只能自己去读源码定位。3.2 Avalonia 的“新生态”其实押注在 .NET 的火箭上Avalonia 自己的生态并不厚但它背后的 .NET 生态厚到吓人。你想想.NET 8 在性能、AOT 发布、GC 调优、跨平台支持上走了多远微软每年还在疯狂往里面投入。Avalonia 作为 .NET 生态里最活跃的桌面 UI 框架等于在搭乘一艘大船前行。Avalonia 引入第三方库的体验和 Qt 完全不同。Qt 的新功能模块可能要等一个大型迭代才有很多时候还要自己做封装Avalonia 这边直接 nuget 一把梭XAML 里用 CommunityToolkit.Mvvm 做源生成器通知属性用 Microsoft.Extensions.DependencyInjection 做依赖注入再配合 Serilog 做日志开发体验无限接近现代 Web 后端开发。我的实际体感是Avalonia 项目里写业务逻辑的代码密度比 Qt 高很多。C# 的语言特性能省掉大量样板代码。数据绑定不需要像 C 信号槽一样手动连接和断开而是靠 INotifyPropertyChanged 自动驱动界面更新。做一次 MVVM 重构效率比在 Qt 里硬写 controller 快太多。3.3 发布、安装包和跨平台分发是绕不开的坎很多人在选型时看的是开发期的生产力忽略了发布期的痛苦。Qt 发布软件尤其是 Windows 上第一件事就是处理各种 DLL 依赖。你用 windeployqt 工具能自动把 Qt 的运行库拷贝进发布目录但遇到第三方插件、QML 模块、编译器的运行库还是要反复检查还经常遇到用户机器上报“no Qt platform plugin could be initialized”这类经典的找不到平台插件错误。我在一次交付时就因为忘了拷贝 platforms 目录下的 qwindows.dll导致直接闪退被客户追着问了一个晚上。Avalonia 发布要简单一些核心是 .NET 运行时或自包含发布。用dotnet publish -r win-x64 --self-contained这种命令可以把整个项目打成一个大文件夹或单文件可执行程序不需要额外配置什么平台插件。文件体积会比 Qt 大一些但考虑到不需要分析依赖发布流程省心得多。Linux 上 Qt 的坑更多。用户报错“qxcbconnection: failed to initialize xrandr”十有八九是 xcb 插件运行库不完整缺 xcb-xinerama、xcb-cursor 之类的系统依赖。再往下追还有可能碰到输入法、Wayland 会话兼容性问题。Avalonia 在 Linux 上依赖的底层包也不少但一般通过官方文档配好基础依赖后各大发行版跑起来都挺稳。4. 实操实录热词背后的那些坑也是选型的重要依据4.1 “Windows no Qt platform plugin”和 Linux 依赖都是 Qt 的门槛你一定见过这样的 Qt 新手提问程序在本机跑得好好的放到别的电脑上双击就报“could not find the Qt platform plugin windows”或者运行毫无反应。原因基本一致缺少 platforms 目录下的平台插件或者插件版本与运行库不匹配。Qt 的跨平台启动流程本身先加载 QPAQt Platform Abstraction插件Windows 上需要 qwindows.dllLinux 上需要 qxcb.so 或 qwayland.somacOS 上则是 qcocoa.dylib没有它们程序连窗口都创建不出来。很多 Qt 发行版的解决方案里都写了“reinstalling the application may fix this problem”重装程序可能会修复但实际上只是治标不治本。正解是用 windeployqt 正确生成部署目录并检查发布目录是否包含整个 platforms、styles、imageformats、iconengines 等插件文件夹。Linux 上还需要关注 X Server、xcb 插件和图形驱动之间的依赖链条完整的是屏幕硬件 ← DRM 内核模块 ← X Server(Xorg) ← X11 协议 ← Qt 的 xcb 插件 ← 你的程序。在这一串链条中任何一环缺失都会造成界面无法启动或是启动后刷新异常。我在调试一个 Linux 工控机程序时Xorg 正常但 Qt 应用连不上显示服务后来排查发现是用户环境里缺少 libxkbcommon-x11 库导致 xcb 插件初始化失败。每次看到有人问“q xcbconnection failed to initialize xrandr”我都想提醒先检查系统依赖库是否齐全。Avalonia 在这一层不存在“platform plugin”概念它的 Linux 后端有两种模式X11 和 Wayland程序启动时自动选择可用的显示协议。虽然不用手动部署插件但如果你跑在精简版 Linux 系统上缺少 libX11 或者 libICE 这一层 X11 客户端库时依然会报底层错误。换句话说跨平台界面框架都逃不过和系统图形栈打交道但 Avalonia 把这种底层配平放在了运行时里开箱即用率确实高很多。4.2 Qt 的时间驱动、事件循环与多线程剪不断理还乱Qt 的高频问题里还有“qt 命令行”“QCoreApplication::exec() 之后无法捕获了”“qt多线程”这些关键词背后其实都指向 Qt 的事件循环机制。很多初学者写 Qt 时习惯在 main 函数里先写一堆初始化逻辑再进入 exec()结果发现 QCoreApplication 还没跑起来网络请求、定时器一个个都不触发。正确做法是做两步走先在 exec() 前完成对象构建和事件连接然后才启动事件循环。多线程更是 Qt 的重灾区。QThread 的正确用法不是重写 run() 然后在 run() 里写一个 while 死循环而是用信号槽把工作对象投递到子线程的事件循环里。一些新手会用 QThread::sleep 卡住线程来模拟定时任务结果把界面线程也卡住整个程序表现成“未响应”。我做过一个信号处理相关的 Qt 小工具用 QCustomPlot 实时显示时域波形、再用 kissfft 转频域图。最初把 FFT 计算直接放在数据采集信号的槽函数里采集线程一有数据就全量计算导致 QCustomPlot 的 replot 被阻塞界面掉帧严重。后来改成用 QtConcurrent::run 把 FFT 包到线程池里算完后再用信号把频谱结果投递回 GUI 线程做绘制问题瞬间解决。这种“信号槽自动队列化”的设计比手写锁要省心得多但也要求你对跨线程投递的规则足够敏感。Avalonia 同样强调不要在 UI 线程做重型操作。它使用的是 .NET 的 Task 异步模型比 Qt 的信号槽在语义上更直观耗时操作用 async/await 的方式丢到线程池完成后同步上下文会自动把后续操作切回 UI 线程。这对写业务代码来说友好很多但也要注意如果用了.ConfigureAwait(false)又强行访问控件属性还是会报线程错误。4.3 做界面自定义从“能显示”到“好看”的差距Qt 的默认观感一直被人吐槽“老气”。QWidget 原生按钮、输入框谈不上好看用样式表 QSS 可以做一定美化但要实现毛玻璃、圆角卡片、悬浮阴影、渐变按钮这种现代 UI就会觉得 QSS 力不从心。QML 在视觉效果上强得多你可以写动画、变形、粒子效果但 QML 的性能优化是一套全新的学问不当的锚点布局、频繁创建组件很容易把流畅度做崩。Avalonia 的样式模型类似 WPF但不是 QSS 不是 CSS它用 XAML 里的 Style 定义控件的模板和绑定属性。做主题时所有控件可以通用一套样式按钮、卡片、输入框可以做成非常统一的设计语言。这正好戳中了很多做产品级工具的痛点产品经理要“界面像一个现代桌面软件”Avalonia 做起来比 QWidget 顺手太多。如果要做等待提示框、loading 动画、动态告警浮层这类效果Avalonia 写一个 UserControl 自己控制视觉状态即可比在 Qt 里捣鼓透明窗口容易好几倍。图表和图形绘制方面如果是要画频谱图、时域波形、示波器界面Qt 搭配 QCustomPlot 是经典组合。QCustomPlot 的上手路径是准备好时间轴刻度、数据容器、调用 replot 刷新换到频域显示用 kissfft 做一次快速傅里叶变换输出复数数组的幅度作为纵轴数据再绑定到 QCPGraph 上。Avalonia 上可以用 LiveCharts2 或 ScottPlot但如果你有大量自定义渲染需求也可以用 Avalonia 的 DrawingContext 自己画线。底层用 Skia 画折线的效率并不差只是你需要自己处理坐标计算没有现成控件好用。4.4 Qt 和外部系统集成是从“玩具”到“工业级”的考验热词里出现“qt怎么调用halcon”“qt post请求无法获取”“request method post not supported”这类问题说明很多人在做的是软硬件一体化的系统工具。Qt 在这里的优势是你可以直接用 C 调用各种工业库比如 Halcon 的 C API、OpenCV、PCL 点云库编译时只需要处理好头文件目录和动态库路径即可。数据流可以直接放到 QByteArray 传给硬件设备代码链路短性能损耗低。做 HTTP 通讯时 Qt 也一样方便但有个老坑QNetworkAccessManager 发 POST 请求时如果服务端返回405 Method Not Allowed通常不是 Qt 的问题而是请求头没设置Content-Type: application/json或者发的是 GET 请求服务端不接受。还有一个容易误导新人的点是有些 HTTP 服务端需要 CORS 策略头或者带 Token 的 Authorization 头你漏掉一个就得到看不懂的状态码。排查时要先看服务端的访问日志再看 Qt 端实际发出的请求报文。如果你在 Avalonia 里做上位机软件调用这类 C 工业库就必须写 P/Invoke 包装层了。这是个不小的工程需要把 .NET 类型转换为 C 指针管理内存生命周期处理好回调比 Qt 里直接用 C 调用复杂得多。但好处是 P/Invoke 层封装好以后团队后续可以继续在 C# 侧写业务逻辑开发的舒适度和迭代速度远超 C。5. 选型决策清单新项目和老项目分别怎么落子5.1 全维度对比到底谁在什么场景里能赢做技术选型最忌讳只听一两个案例就下判断。我把自己实际体验过的关键维度汇总成一张“选型地图”能帮助你在开会时快速对齐思路选型维度QtWidgets/QMLAvalonia UI我的建议开发语言C / JavaScript(QML)C#团队背景决定主力语言比框架更难换界面开发效率Widgets 偏慢QML 较快快类 WPF 开发体验追求迭代速度选 Avalonia跨平台一致性QWidget 有平台差异QML 较好像素级一致需要统一观感选 Avalonia工业底层能力极强串口、网络、进程、OpenCV 全打通靠 .NET 库部分需 P/Invoke主做设备通信选 Qt部署复杂度Windows 需处理 DLL 依赖Linux 依赖多自包含发布较省心客户环境混乱选 Avalonia性能上限高可精细管理内存中等偏上GC 会引入卡顿风险严苛实时场景选 Qt生态成熟度极成熟方案丰富上升期踩坑需要自己扛短工期避坑选 QtUI 现代化程度QML 可做到Widgets 难天生适合现代简洁设计产品颜值要求高选 Avalonia社区与人才大量老工程师资料丰富C# 开发者容易上手招聘环境需要提前判断不要只看技术优势还要看你能不能招到人。市面上会 Qt 的工程师大部分是 C 背景如果你们项目本身不是 C 技术栈单独为了 UI 引入 Qt意味着要维护一套 C 代码反之如果整个团队都是写 C# 的服务端工程师转 Avalonia 非常顺你甚至可以让后端顺手接手界面层的工作这是巨大的组织效率优势。5.2 工控、嵌入式设备场景Qt 仍然稳得一批纯工业场景老实说还是 Qt 的地盘。Qt 官方支持嵌入式 Linux交叉编译到 ARM 板子上的工具链已经很成熟甚至早就有qt 如何交叉编译生成能在开发板运行的文件这类完善的文档和社区答案。很多设备制造商从硬件 BSP 到软件框架都是 C/C 一套走下来Qt 嵌入进去毫无违和感。想用 Avalonia 跑嵌入式 Linux现在的方案是 .NET 的 linux-arm64 自包含发布然后搭配一个轻量的 X11/Wayland 显示后端。技术上可行但受限于工业现场的硬件规格CPU 主频不高、内存只有几百兆时.NET 运行时加 Skia 渲染的内存占用会比 C 版 Qt 大得多。再加上工业软件开发周期普遍较长团队沉淀了大量 C 代码迁移到 C# 的回报很低风险却很大。所以你在设备、医疗仪器的上位机软件里看到 Qt 的比例还是压倒性的。5.3 桌面工具、企业级应用、跨平台 SaaS 客户端Avalonia 值得重仓反过来看面向普通用户或者企业内部使用的桌面工具、管理软件、数据看板Avalonia 的优势越来越明显。C# 写业务逻辑太舒服了尤其是和 Web API 后端配合时很多模型类可以前后端共用开发效率直接翻倍。而且用户对这种软件的界面预期是现代、简洁、可换主题Avalonia 完美适配。Avalonia 官方还支持通过 Avalonia UI 的Desktop项目扩展到浏览器 WebAssembly 端。虽然生产环境大规模用 WebAssembly 的案例还不多但至少给了你一个“同一个 UI 工程未来可以顺带出 Web 端”的期权。Qt 也有 Qt for WebAssembly但体验相对小众。单凭这一点团队在选型时就会把 Avalonia 放在优先试水位。我还特别想提醒一点如果你周围已经有用 WPF 写了多年的老项目现在有跨平台需求把整个 WPF 迁移到 Avalonia 的成本远比“把 WPF 项目推倒重来用 Qt 写一遍”低得多。因为两者的 XAML 概念几乎同构控件树、数据绑定、路由事件、样式系统的对应关系都很直接。我做过一个从 WPF 迁移到 Avalonia 的试点项目一个 30 多个窗体的客户端两个开发迁移了大概三周主要工作都花在系统集成代码重写上界面部分几乎是平移。最后一点个人心得跑了这么久的两边项目我最大的体会是跨平台框架没有魔法有的只是选择“把复杂度藏在哪里”。Qt 把复杂度藏在了编译、部署和 C 的内存管理里你付出的是工程成本换来的是对硬件的极致控制和工业级生态Avalonia 把复杂度交给了 .NET 运行时和 Skia 引擎你付出的是运行时体积和一定的性能不确定性换来的是极高的开发效率、统一 UI 和现代化工程实践。如果你正在做技术选型我的建议很简单先放下框架的“信仰之争”把项目的硬件约束、客户部署环境、团队技术栈、产品颜值要求这四个约束条件拉出来过一遍答案会自己浮现出来。Qt 依然是一棵深根老树稳、硬、全面Avalonia 更像一列正在加速的火车起点晚但轨道铺设得很现代越往后你会越看好它的长期价值。两个方向都不缺饭吃关键是你脚下站的土地更适合哪棵树扎根。

相关新闻