文章摘要
作者回忆了使用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鼠标光标反馈问题。
UI复刻
- 侧边栏支持65px(图标模式)和260px(完整模式)切换,右侧聊天区最小宽度380px。
- 消息气泡底部小尾巴通过SVG路径动态切换方向,emoji弹窗模仿Telegram的展开/搜索交互。
- 使用
NumberAnimation和插值函数实现同步动画(如展开/折叠效果)。
系统托盘集成
- 利用Qt实验性模块
Qt.labs.platform的SystemTrayIcon,通过ShaderEffectSource动态生成带未读数的图标。 - 应用图标设计为扩音器形状,避免与现有应用混淆。
- 利用Qt实验性模块
C++桥接
- 通过CMake编译静态库,导出
extern "C"函数供Rust调用,注册QML类型(如覆盖鼠标光标功能)。 - 保持构建流程简洁,仅当C++文件变更时重新编译。
- 通过CMake编译静态库,导出
当前成果
项目已实现基础UI框架,包括侧边栏、消息列表、动画交互和系统托盘功能。代码仓库中QML占比最高(52.1%),Rust占34.3%,C++仅13.6%。作者表示未来可能用Rust处理业务逻辑,但暂未深入。
后续计划
是否继续开发取决于兴趣优先级(如游戏引擎或CAD项目)。尽管完成度有限,作者认为此次探索成功验证了技术组合的可行性。
注:原文中的视频和图片链接未保留,部分技术细节已简化。
评论总结
以下是评论内容的总结:
- 即时通讯软件比较
- 观点: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"
- 开发工具讨论
- 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"
- 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"
- 界面设计反馈
- 对特定emoji界面的肯定:
- "your emoji pop up thing looks better then Telegram's...Yours was nice and clean"
- 技术设想
- 分布式聊天协议建议:
- "create a torrent like protocol for chat...host for their own circle of friends"
总结呈现了关于通讯软件、开发工具、GUI框架等多个技术话题的不同观点,保留了原始评论的关键表述,同时保持了不同立场观点的平衡性。