Hacker News 中文摘要

RSS订阅

使用Qt、QML和Rust(以及C++)编写一个明目张胆的Telegram克隆版 -- Writing a blatant Telegram clone using Qt, QML and Rust. And C++

文章摘要

作者回忆了使用Qt和QML开发界面的愉快经历,并表达了对Rust语言的喜爱。他原本想用这些技术开发一个类似Telegram的聊天应用,但因故搁置。文章主要分享了他对界面设计和编程语言的个人见解。

文章总结

使用Qt、QML和Rust(及C++)开发Telegram克隆应用

项目背景
作者出于对Qt/QML的怀念(十年前曾使用过)以及对Rust的喜爱(自2012年起关注其编译时指针安全检查特性),决定结合两者开发一个Telegram风格的即时通讯应用。尽管日常工作以全栈Web开发为主,作者一直希望尝试开发真正的原生应用。

技术选型
- UI框架:选择QML因其设计直观,动画实现便捷,类似早年使用Svelte的体验。
- 后端语言:主要用Rust,但通过C++补充Qt未暴露的功能(如系统托盘图标数字提示)。
- 参考项目:受Telegram的UI启发(如侧边栏折叠、消息气泡动画),同时借鉴Element X客户端的matrix-rust-sdk库。

开发过程
1. 环境搭建
- 尝试cxx-qt时因构建缓存问题转向qmetaobject-rs,后者支持快速QML热重载(通过文件监听和AtomicBool触发重启)。
- 实现自定义分栏控件,修复原生SplitView鼠标光标反馈问题。

  1. UI复刻

    • 侧边栏支持65px(图标模式)和260px(完整模式)切换,右侧聊天区最小宽度380px。
    • 消息气泡底部小尾巴通过SVG路径动态切换方向,emoji弹窗模仿Telegram的展开/搜索交互。
    • 使用NumberAnimation和插值函数实现同步动画(如展开/折叠效果)。
  2. 系统托盘集成

    • 利用Qt实验性模块Qt.labs.platformSystemTrayIcon,通过ShaderEffectSource动态生成带未读数的图标。
    • 应用图标设计为扩音器形状,避免与现有应用混淆。
  3. C++桥接

    • 通过CMake编译静态库,导出extern "C"函数供Rust调用,注册QML类型(如覆盖鼠标光标功能)。
    • 保持构建流程简洁,仅当C++文件变更时重新编译。

当前成果
项目已实现基础UI框架,包括侧边栏、消息列表、动画交互和系统托盘功能。代码仓库中QML占比最高(52.1%),Rust占34.3%,C++仅13.6%。作者表示未来可能用Rust处理业务逻辑,但暂未深入。

后续计划
是否继续开发取决于兴趣优先级(如游戏引擎或CAD项目)。尽管完成度有限,作者认为此次探索成功验证了技术组合的可行性。

注:原文中的视频和图片链接未保留,部分技术细节已简化。

评论总结

以下是评论内容的总结:

  1. 即时通讯软件比较
  • 观点:Telegram拥有最佳用户界面,Signal隐私保护最好,WhatsApp用户基数最大
    • "Telegram: Best UI. Signal: Best privacy. WhatsApp: Largest userbase"
    • "Good UI, though not as good as Telegram. Arguably better privacy than Signal"
  1. 开发工具讨论
  • Qt Creator支持观点:
    • "Qt Creator is actually very good...I instead use Qt Creator for all my C++ development"
  • VS Code/Rust工具问题:
    • "VS Code was running cargo check one way while in the terminal cargo check was doing some other thing"
    • "RustRover...seems to start over rebuilding more things"
  1. GUI开发框架评价
  • QML积极评价:
    • "QML is a great language to make GUIs...XAML kind of sucked in comparison"
  • Rust GUI现状批评:
    • "The GUI situation in Rust is dreadful...Rust is simply not meant for GUI-based data design"
    • "No one else is worried about this missed opportunity"
  1. 界面设计反馈
  • 对特定emoji界面的肯定:
    • "your emoji pop up thing looks better then Telegram's...Yours was nice and clean"
  1. 技术设想
  • 分布式聊天协议建议:
    • "create a torrent like protocol for chat...host for their own circle of friends"

总结呈现了关于通讯软件、开发工具、GUI框架等多个技术话题的不同观点,保留了原始评论的关键表述,同时保持了不同立场观点的平衡性。