是否应该尝试使用 Qt QML 重写 Electron 应用。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
vfs
V2EX    程序员

是否应该尝试使用 Qt QML 重写 Electron 应用。

  •  
  •   vfs 11 天前 4171 次点击

    正如之前在 ref: t/1144403#reply14 帖子中所提到的,我自己写了一个 S3 客户端,使用 Electron 作为 UI ,c++ 写的网络库。 目前已经基本完成。

    但是最近遇到一个问题: 当我的远程“目录”中文件数量较多的时候,UI 会卡死。原因是我的 UI 中没有在 Table 中使用虚拟化技术。 网上找了一圈,目前 shadcn ui table 的 tanstack-virtualizer 一起工作的例子还没找见,去 shadcn ui 官方 issue 看了一下,有人问过类似问题,但是很长时间了依然没有解决方案。 这只是个引子,这里不讨论如何解决这个问题了。

    所以最近在考虑是否应该使用 Qt QML 来重写我的这个工具, 主要有以下考虑:

    1. 我个人对于 Web 技术的掌握非常浅,大部分事件依赖 AI 给我的方案。AI 解决不了的,大概率我也解决不了

    2. Electron 有点儿吃内存,打包大小也有些大。 感觉对与我这种工具来说,有点儿太重了。

    3. 我的 c++ 库暴露成 js 需要手动编写 napi wrapper ,也有点儿繁琐

    4 )但是对于 QML 我也需要重新学习,但是预期这个性能会好很多。

    5 )还多多少考虑到 nodejs/js 中依赖太多,水平质量层次不齐。

    想知道,这里的大佬们如何看待这个问题。 提前谢过!

    第 1 条附言    11 天前
    感谢各位大佬的分享看法。 大部分人的建议都是找方法来虚拟化当前 electron UI ,那就继续修了。

    至于说 .NET, 一开始就考虑过,就个人来说,这个方案对我来说没有任何吸引力:一则 .NET 依赖于额外的 dotnet 或者 .net framework, 应用不能开箱即用,再者是也没有喜欢的 UI 框架。

    QML 个人之前学过一阵子,确实是能达到和 web 差不多的效果,但是生态太差了,没有现成的 UI 库,需要自己从头开始写,难度应该不会小。 再一点,它的内存使用和性能也并不能达到原生那么快。今天也试了 gemini 来帮我生成一些代码,效果自然也不好,至少是达不到 web 那么好的效果。
    64 条回复    2025-12-06 09:57:10 +08:00
    NoNewWorld
        1
    NoNewWorld  
       11 天前
    闲的话,可以试试
    C64NRD
        2
    C64NRD  
       11 天前
    既然你不擅长 web 技术,那也不必犹豫了,just do it!
    spritecn
        3
    spritecn  
       11 天前
    @NoNewWorld 写 s3 客户端的人应该不忙
    weixind
        4
    weixind  
       11 天前
    写都写完了,迁移的收益其实不明显。

    分页 + 搜索 或者上拉加载下一页就行了。没太必要传输所有的文件数据。
    layxy
        5
    layxy  
       11 天前
    虚拟列表的性能并不差,可以用支持虚拟列表的 ui 库试下,比如 vxe-table
    x007xyzabc
        6
    x007xyzabc  
       11 天前
    是我的话,选择自己实现支持 tanstack-virtualizer 的表格
    iugo
        7
    iugo  
       11 天前
    Web 的生态非常丰富, 迁移到 Qt 可能有依赖相关的问题.
    masterclock
        8
    masterclock  
       11 天前
    QML 这种神经病还是算了吧
    liaohongxing
        9
    liaohongxing  
       11 天前
    Web 大数据可以虚拟列表,但是看你会 c++ ,建议转 QT
    zhzy
        10
    zhzy  
       11 天前
    涉及到远程目录感觉问题应该不在 Electron ,QML 也没什么生态,建议不要改了,重新设计一下 UI 吧
    liuliuliuliu
        11
    liuliuliuliu  
    PRO
       11 天前
    QT 也是个坑啊,桌面 UI 这块还是 .net 吧,跨平台,原生编译,没啥缺点了
    abc0123xyz
        12
    abc0123xyz  
       11 天前
    .net 吧,简单
    wobuhuicode
        13
    wobuhuicode  
       11 天前
    这是技术设计问题,又不是性能问题。直接渲染长列表,大 Table ,换谁来都卡。要说 QTableView 本身有虚拟化,但 delegate 写得不好也是卡。
    colourfulsai
        14
    colourfulsai  
       11 天前
    不跨平台考虑下 WPF 吧。现有的 C++代码也可以用 C++/CLI 快速复用。
    vfs
        15
    vfs  
    OP
       11 天前
    @NoNewWorld 啊,虽然是个人业余的小项目,但是时间还没多到在 UI 上花费那么多功夫来尝试,还是算了,继续用 Electron 吧,找找解决方案。
    vfs
        16
    vfs  
    OP
       11 天前
    @spritecn 业余项目,说不上忙,但是也不想把时间都花在 UI 上。。。
    vfs
        17
    vfs  
    OP
       11 天前
    @masterclock 赞成,之前再另外的项目中尝试过,确实不是很理想。 这里提这样的问题还有一点考虑是:Qt QML 更接近 c++, 不需要 napi wrapper ,调试也更方便一些,但是短板很明显,没有现成可用的 UI 库。
    vfs
        18
    vfs  
    OP
       11 天前
    @weixind 是啊,自己考虑了好几天,拿不定主意,这里才问的。 现在定下来了,继续 web 技术栈干
    vfs
        19
    vfs  
    OP
       11 天前
    @wobuhuicode qml 中应该最后还是有一层和 web 相同的 js 引擎,之前已经修复了一个 c++ 到 js 传递数据导致性能低下的问题。 这方面来说,应该两者面临的问题是一样的
    BingoXuan
        20
    BingoXuan  
       11 天前
    用 ai 做虚拟 table 应该很容易。最近我用 Gemini 3 Pro 就写了 WEBGL2 加速的绘图库。每秒刷新 1.5M 数据点都能保持 60fps (但 WEBGL 真的性能差,WebGPU 又不成气候)

    用了 c++,不如尝试一下 c 的 webview 。可以直接 bind c function
    drymonfidelia
        21
    drymonfidelia  
       11 天前
    谁告诉你.NET 不能开箱即用的,别说 standalone 现在 AOT 都可以了,缺点要说的话就是跨平台框架没有很成熟的都是一堆 Bug ,所有 LLM 都会混淆各种 XAML 方言、和 3D 有关的功能疯狂胡编 Unity API 出来
    liyafe1997
        22
    liyafe1997  
       11 天前
    QML 还能跨跨平台,.net 用什么? WinForm/WPF ?直接绑死在 Windows 上了。
    也许还能看看 Flutter 。
    cwaxxd
        23
    cwaxxd  
       11 天前
    @liyafe1997 #22 .net 跨平台有 Avalonia ,https://github.com/avaloniaui/avalonia
    a33291
        24
    a33291  
       11 天前
    @liyafe1997 你这信息还留在 10 年前
    https://avaloniaui.net/ 之流还支持鸿蒙
    guiyumin
        25
    guiyumin  
       11 天前
    @liuliuliuliu 有个 avalonia ui, 那个咋样?
    vfs
        26
    vfs  
    OP
       11 天前
    @BingoXuan "用了 c++,不如尝试一下 c 的 webview 。可以直接 bind c function" 这倒是个不错的想法。 但是个人真的不是想在这里太折腾了,太小众的方案总让人不放心
    ddup
        27
    ddup  
       11 天前 via Android
    @guiyumin 你看官方 showcase 蛮多应用用的
    nilaoda
        28
    nilaoda  
       11 天前
    avalonia + native aot 可以实现跨平台/秒开/无需运行时,不过也有一些坑要踩。

    还是基于现有的 web 改吧~
    liuliuliuliu
        29
    liuliuliuliu  
    PRO
       11 天前
    @guiyumin 嗯我说的就是这个,.net 平台下的 ui 框架很多,官方的、非官方的、跨平台的、不跨平台的,最终还是推荐这个 avalonia ui
    susunus
        30
    susunus  
       11 天前
    你用 flutter 或者 kotlin native 写都比你用 qml 写合适
    BingoXuan
        31
    BingoXuan  
       11 天前
    @vfs pywebview 也是小众方案。但目前我也用在公司项目上了。还是很稳的
    vfs
        32
    vfs  
    OP
       11 天前
    @BingoXuan 酷! 完了找机会试试。
    Al0rid4l
        33
    Al0rid4l  
       11 天前
    "一则 .NET 依赖于额外的 dotnet 或者 .net framework, 应用不能开箱即用" 不, 有 selfcontained 打包, 你可以说你不喜欢, 但说要依赖额外的运行时那就尬黑了
    liuliuliuliu
        34
    liuliuliuliu  
    PRO
       11 天前
    来,试试 .net 写的跨平台的,无须运行时的,原生编译的,启动快的 git 客户端

    https://github.com/sourcegit-scm/sourcegit/releases
    liuliuliuliu
        35
    liuliuliuliu  
    PRO
       11 天前
    @liuliuliuliu #34 还有 20m 的压缩包体积
    wazggcd
        36
    wazggcd  
       11 天前
    不能加个分页吗?
    vfs
        37
    vfs  
    OP
       10 天前
    @liuliuliuliu 感谢分享,很惊艳。
    vfs
        38
    vfs  
    OP
       10 天前
    @wazggcd 个人感觉分页不太适合我这个文件列表的场景,每次让用户点击上一页下一次体验估计会不太好。 所以没有用分页
    vfs
        39
    vfs  
    OP
       10 天前
    @Al0rid4l 并没有尬黑。 在我的上述表述之前,我只做过 windows 上 winform 的 .net GUI ,没试过其他的方案,属于是自己凭空想象的,是我表述不对。
    colourfulsai
        40
    colourfulsai  
       10 天前
    .NET 可以让可执行文件 开箱即用 的,编译程序设置 --self-contained true 就可以。没有喜欢的 UI 框架这个就没办法了。
    jamesjammy061
        41
    jamesjammy061  
       10 天前
    搞着搞着就会变成 c++skia ,再搞搞就变成 flutter 了
    dford
        42
    dford  
       10 天前
    Gemini 连 10 几行的 shell 脚本都写不对,就别拿来做论据了,至少试过 Claude sonnet4.5 再说
    play78
        43
    play78  
       10 天前
    @vfs #38 参考手机 app 的瀑布流方式。 滚动时,再分页加载。
    一般预加载 3-5 页数据,每次只渲染当前页,+2 页、-2 页
    然后根据总页数,显示虚拟的滚动条。
    其实就是虚拟列表的原理。你会 C++,这对你来说实现应该很简单才对。
    cnbatch
        44
    cnbatch  
       10 天前
    跨平台?还有另一个选择:wxwidgets

    100%操作系统原生控件,可能美观度是差了点,不过性能方面无须怀疑,就是原生的响应速度
    wanmyome
        45
    wanmyome  
       10 天前
    wxwidgets 优点是许可宽松,允许闭源,qt 生态好,b 上有一堆初级教程,我干了几个月 wxwidgets 换 qt 的
    DonaidTrump
        46
    DonaidTrump  
       10 天前
    用 GPUI Component ,他们介绍里就有关于大量数据渲染的


    High Performance: Virtualized Table and List components for smooth large-data rendering.
    dosmlp
        47
    dosmlp  
       10 天前
    如果时间比较多可以试试,但是 qml 也有很多 bug ,我 6 月份提了一个现在还没解决
    mayli
        48
    mayli  
       10 天前
    @liuliuliuliu avalonia ui 看起来的确还行,就是没看到 Android 和 ios 生态
    Vaspike
        49
    Vaspike  
       10 天前
    跨平台? 来人把 Java/Kotlin 端上来, 你敢给内存资源我绝对不让你卡
    liuliuliuliu
        50
    liuliuliuliu  
    PRO
       10 天前
    @mayli
    可以看他自己的这个纸牌接龙的 demo
    https://github.com/AvaloniaUI/Solitaire
    横跨 6 个端 ( windows/linux/macos/浏览器/ios/android ),这是他浏览器 webassembly 的地址 https://solitaire.xaml.live/

    个人感觉 ios/android 生态可能确实不太好,当然我也没实际拿他开发过 ios/android
    Mithril
        51
    Mithril  
       10 天前
    .NET 也可以做到开箱即用的,UI 框架也很成熟,但没有 Web 技术这么成熟。真想做个业余项目,想要个好点的 UI ,但又不想花太多精力在上面,那最好还是各种套壳的 Web 框架。

    觉得 Electron 太重,也可以试试 WebView 。但本质上也是一样的 Web 。
    ZztGqk
        52
    ZztGqk  
       10 天前 via iPhone
    我印象里 table 都没别的依赖参与,又不是 data table ,virtualize 很好做吧
    vfs
        53
    vfs  
    OP
       10 天前
    @dford 我其实已经说明了这里主要不是讨论是否能解决 web 端虚拟列表的问题(虽然我现在也已经做好了)。 至于说哪个 ai 能解决这个问题,我也不想争辩。 顺便提一下,昨天试了一下 claude ,它告诉我说它无法生成 tanstack 相关的代码
    vfs
        54
    vfs  
    OP
       10 天前
    @play78 谢谢,也是一个很好的方法。 我目前使用 TableVirtuoso 库来处理了。
    vfs
        55
    vfs  
    OP
       10 天前
    @cnbatch 哈哈,这个我真用过。 放弃了,主要是太丑了。。。但是真的轻量,内存占用小,打包大小也小,还有一个 designer 可以直接拖拽设计 UI 。
    vfs
        56
    vfs  
    OP
       10 天前
    @wanmyome wxwidget 唯一的短板就是不太容易做的好看(好看是说不丑)。 包括它的论坛都特别友好,我问过几个问题,那个 max 很快就会回复
    vfs
        57
    vfs  
    OP
       10 天前
    @DonaidTrump 呀,这个看着太高级了,我就一菜鸟,想找一个直接能用的:(
    vfs
        58
    vfs  
    OP
       10 天前
    @dosmlp 你是付费用户吗? 我几年前给 widget 提的一个 bug ,也没动静,去问问人家的修复状态,都没人理我
    vfs
        59
    vfs  
    OP
       10 天前
    @Vaspike 所以说,只要我内存够大,cpu 性能够强劲,网速够快,所有的程序都是高性能程序 :)
    vfs
        60
    vfs  
    OP
       10 天前
    @Mithril 是的,我觉得我需要的仅仅是一个不难看的 ui ,我可以在 c++ 做所有其他逻辑。 选择 Electron 的主要出发点是考虑用的人多,应该奇怪的问题比较少。 其他方案担心比较小众,出问题不好解决
    vfs
        61
    vfs  
    OP
       10 天前
    @ZztGqk 是的,最普通的 ai 也能直接生成可用的代码。 麻烦在我用了 shadcn ui 的 table ,然后想要继承其他的,ai 一直改不对。(当然,我用的 ai 没那么优秀)
    Mithril
        62
    Mithril  
       9 天前
    @vfs 我之前也做过类似的东西,只能说建议你还是用国产的 UI 框架。比如 Ant Design 或者 Element Plus 。你可以说国产这些 UI 审美不行,或者有其它什么别的缺点。但它们也是应对奇奇怪怪需求最多的,基本上你能想到的问题,或者功能,大多数都能做到开箱即用。
    vfs
        63
    vfs  
    OP
       9 天前
    @Mithril 哎, 误入歧途了。 最开始是看 shadcn ui star 比较多,就无脑入坑了
    mayli
        64
    mayli  
       9 天前 via Android
    @liuliuliuliu 看了,感觉还行,体积性能跟目前其他家的方案差别不大,而且没有直接发 apk, 我看 apk 打包都接近 100m 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3616 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 05:09 PVG 13:09 LAX 21:09 JFK 00:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86