我不知道楼主说的“统一”是指不同平台的可移植性还是指库之间的可移植性
首先 Qt 不是“一个”标准,分 QtWidgets 和 QML 。
然后 iOS 也不是“一个”标准,分 Objective-C 和 Swift ,然后又分 UIKit 和 Swift UI 。
MSVC 更不是“一个”标准,更像是“你是一个一个一个一个标准啊”
就连 Java 这个一开始就打着“一次编译到处运( tiao )行( shi )”旗号的平台,自己都裂出了 AWT ,Swing 和 JavaFX 。
Web 那边各种框架就不说了 ...
Gamedev 里 dear imgui 目前主要用来做开发工具(这次 GTA6 泄露貌似就看到一堆),还没见过正经游戏 UI 流行 dear imgui 的
说起游戏 UI 这又是一个大坑,你会发现它和传统 GUI 程序的 UI 根本不是一类东西,而 dear imgui 明显更适合做传统类型的(准确来说,是“游戏中的传统 UI”这一超级细分领域)
这上面继续展开还有试图用猴版 HTML 做游戏 UI 的 libRocket 之类的存在。我最近也在搞 Unity ,你知道现在 Unity 作为最流行的通用游戏引擎,官方提供的 UI 框架就有俩么( UGUI ,UI Toolkit )。可见 Gamedev 自己也在试图分裂标准。还什么 Gamedev 已经统一了,上面有句好话是怎么说来着,“你说统一我都觉得有些好笑”。
如果你仅仅是要跨平台可移植代码,我建议你一开始就在 Qt ,HTML ,Swing ,JavaFX 和 wxWidgets 里面选。这几个都是桌面平台间可移植的,不存在“对代码的移植,有很大的伤害”这种事。如果你还要兼容 Web 平台,那选择很明显了就是 HTML 。
移动平台很明显目前较严重的偏离了桌面传统 WIMP 体系,不存在和桌面平台“统一”的基础,你要统一的话 HTML 和 QML 都可以,后者就是用于 application 的 HTML 。
不说一堆 Qt 原生的软件,Beyond Compare 知道吧,人家是 Pascal 写的,把 Pascal 在桌面领域打出来的是 Delphi 7 ,这玩意当年是 Windows 上桌面开发的“瑞士军刀”(这词和 Delphi 7 流行的年代差不多 ...),但是现在能用 Locutus (划掉) Lazarus 做到跨桌面平台。Lazarus 做的事情其实和 wxWidgets 很像,它就是自己实现了 Delphi 的 API ,然后底下转成各种其他的库( Win32 ,Qt ,GTK 之类)。如果你用 Pascal ,那这就是你的首选——没有其他选择。
(问题来了,现在还有几个人用 Pascal 呢?也许这就是 Pascal 用户“没有其他选择”的原因吧,反观 Web 和 Rust 的 GUI 场景那叫一个热闹)
再说一遍,如果你一开始就选了 wxWidgets ,那直接就可以在桌面平台之间互相移植,不存在“对代码的移植,有很大的伤害”这种事。当然后来可能会面对要移植到 Web 的情况——问题是你一开始为什么不能预见到这种情况并在选型上做出调整?
最后 HTML 本来是用来做“Hypertext”的,“Hypertext”就是“互相链接的文档”,不是用来做 GUI 的。有一部分人用 HTML 做 GUI (包括我 ...),这是削足适履。但实际上目前 HTML+CSS+JavaScript 是目前唯一能够勉强做到跨全平台的交互式布局方案,所以一堆人用 HTML 做 GUI 其实恰恰就是对“没有一个 GUI 标准能一桶浆糊”这一现状的反应。
而且以上除了 HTML 一系之外都不能称为“标准”,压根就没有像样的 spec 文档。非要说的话早年 X ,OpenStep 倒是标准。
不过说到正经的“标准”,桌面 UI 真正在库级别的统一标准目前还不存在,不过放到更低级别的话还是存在的。
UI 的 WIMP 往下是绘制指令,这一层级的标准主要体现在 HTML Canvas 上(当然苹果好像也喜欢用 Display PostScript )。所有的 UI 元素都可以转化为一堆 Bézier Curve 和若干 bitmap 的组合。你会发现 HTML Canvas 和实现类似功能的库,比如 CoreGraphics ,Skia ,Cairo 和 GDI+ 的基本功能都是差不多的,核心概念也都是 Path ,Stroke ,Gradient 这些东西。这一层级可以方便地实现几乎所有的传统平面 GUI 。
再往下,如果你使用 GPU 加速,那么有 3D API 标准给你用,Bézier Curve 最后会转换成 vertex 和 triangle (如果你没有偷懒直接用 NV_path_rendering 那个扩展的话 ...)。桌面平台基本都支持 OpenGL 和 Vulkan 。移动的话 GLES 凑合用,当然某个本站最喜欢的公司似乎不太喜欢 ... 这一层级也可以 cover AR/VR 的 UI 。
再往后到屏幕上就是一堆像素,你输出个 PNG 就行 ...
以上都是像模像样的标准,代码都是可移植的,比如 QML 的官方教程专门 address 了移植 HTML Canvas 代码的问题(
https://www.qt.io/product/qt6/qml-book/ch08-canvas-port-from-html ),因为人家的 API 就 TM 跟 HTML Canvas 是一模一样的 ...
层级越高越难统一,比如编译器底层可以统一 LLVM/JVM ,系统可以统一 Windows/Mac 或 Linux ,但是往上就不好说了,为啥编程语言不统一?为啥笔记软件不统一?为啥你不跟张小龙“统一”?