V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
vfs
V2EX  ›  程序员

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

  •  
  •   vfs · 2 天前 · 3196 次点击

    正如之前在 ref: https://www.v2ex.com/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 条附言  ·  1 天前
    感谢各位大佬的分享看法。 大部分人的建议都是找方法来虚拟化当前 electron UI ,那就继续修了。

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

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

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

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

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

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

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


    High Performance: Virtualized Table and List components for smooth large-data rendering.
    dosmlp
        47
    dosmlp  
       12 小时 48 分钟前
    如果时间比较多可以试试,但是 qml 也有很多 bug ,我 6 月份提了一个现在还没解决
    mayli
        48
    mayli  
       12 小时 35 分钟前
    @liuliuliuliu avalonia ui 看起来的确还行,就是没看到 Android 和 ios 生态
    Vaspike
        49
    Vaspike  
       12 小时 10 分钟前
    跨平台? 来人把 Java/Kotlin 端上来, 你敢给内存资源我绝对不让你卡
    liuliuliuliu
        50
    liuliuliuliu  
    PRO
       11 小时 41 分钟前
    @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  
       11 小时 30 分钟前
    .NET 也可以做到开箱即用的,UI 框架也很成熟,但没有 Web 技术这么成熟。真想做个业余项目,想要个好点的 UI ,但又不想花太多精力在上面,那最好还是各种套壳的 Web 框架。

    觉得 Electron 太重,也可以试试 WebView 。但本质上也是一样的 Web 。
    ZztGqk
        52
    ZztGqk  
       11 小时 7 分钟前 via iPhone
    我印象里 table 都没别的依赖参与,又不是 data table ,virtualize 很好做吧
    vfs
        53
    vfs  
    OP
       9 小时 58 分钟前
    @dford 我其实已经说明了这里主要不是讨论是否能解决 web 端虚拟列表的问题(虽然我现在也已经做好了)。 至于说哪个 ai 能解决这个问题,我也不想争辩。 顺便提一下,昨天试了一下 claude ,它告诉我说它无法生成 tanstack 相关的代码
    vfs
        54
    vfs  
    OP
       9 小时 31 分钟前
    @play78 谢谢,也是一个很好的方法。 我目前使用 TableVirtuoso 库来处理了。
    vfs
        55
    vfs  
    OP
       9 小时 30 分钟前
    @cnbatch 哈哈,这个我真用过。 放弃了,主要是太丑了。。。但是真的轻量,内存占用小,打包大小也小,还有一个 designer 可以直接拖拽设计 UI 。
    vfs
        56
    vfs  
    OP
       9 小时 16 分钟前
    @wanmyome wxwidget 唯一的短板就是不太容易做的好看(好看是说不丑)。 包括它的论坛都特别友好,我问过几个问题,那个 max 很快就会回复
    vfs
        57
    vfs  
    OP
       9 小时 15 分钟前
    @DonaidTrump 呀,这个看着太高级了,我就一菜鸟,想找一个直接能用的:(
    vfs
        58
    vfs  
    OP
       9 小时 15 分钟前
    @dosmlp 你是付费用户吗? 我几年前给 widget 提的一个 bug ,也没动静,去问问人家的修复状态,都没人理我
    vfs
        59
    vfs  
    OP
       9 小时 13 分钟前
    @Vaspike 所以说,只要我内存够大,cpu 性能够强劲,网速够快,所有的程序都是高性能程序 :)
    vfs
        60
    vfs  
    OP
       9 小时 8 分钟前
    @Mithril 是的,我觉得我需要的仅仅是一个不难看的 ui ,我可以在 c++ 做所有其他逻辑。 选择 Electron 的主要出发点是考虑用的人多,应该奇怪的问题比较少。 其他方案担心比较小众,出问题不好解决
    vfs
        61
    vfs  
    OP
       9 小时 7 分钟前
    @ZztGqk 是的,最普通的 ai 也能直接生成可用的代码。 麻烦在我用了 shadcn ui 的 table ,然后想要继承其他的,ai 一直改不对。(当然,我用的 ai 没那么优秀)
    Mithril
        62
    Mithril  
       7 小时 52 分钟前
    @vfs 我之前也做过类似的东西,只能说建议你还是用国产的 UI 框架。比如 Ant Design 或者 Element Plus 。你可以说国产这些 UI 审美不行,或者有其它什么别的缺点。但它们也是应对奇奇怪怪需求最多的,基本上你能想到的问题,或者功能,大多数都能做到开箱即用。
    vfs
        63
    vfs  
    OP
       7 小时 47 分钟前
    @Mithril 哎, 误入歧途了。 最开始是看 shadcn ui star 比较多,就无脑入坑了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:36 · PVG 21:36 · LAX 05:36 · JFK 08:36
    ♥ Do have faith in what you're doing.