内容提要
Qt Bridge for Rust 发布 0.3 测试版,重点提升与 CXX-Qt 的兼容性和健全性。底层改用 CXX-Qt 基础类型,为未来互操作铺路。移除不健全 API,大量内部函数标记 unsafe,改进错误处理。所有权机制重构,引入生命周期注册表,用户对象由 Rc<RefCell<_>> 管理。另有 QmlElement 重命名等小改动,最低 Rust 版本 1.88。
延伸解读
与 CXX-Qt 共享底层类型的影响
0.3 版将 QString、QByteArray、QModelIndex 等基础类型替换为 CXX-Qt 的实现,公开 API 虽未变,但内部维护负担得以合并。这为未来互操作铺路,例如在信号槽中直接使用 QString 可减少 UTF-8 与 UTF-16 间的转换开销。不过,迁移到 CXX-Qt 也导致编译时间显著增加,官方已将其列为未来版本的改进目标。
健全性改进:移除不安全 API 与错误处理
本次更新移除了无法保证健全性的 API,例如 #[qobject] 用户类型的 as_qvariant() 函数,并将大量内部函数和生成代码标记为 unsafe,使调用成为显式行为。同时,错误处理更稳健:在 QObject 附加前发射信号或修改模型不再 panic,include_bytes_qml! 改为编译错误而非 panic,并能正确处理嵌套 Cargo.lock 的工作区路径。
所有权机制重构与生命周期注册表
所有权概念被完全重构,引入了一个在 Rust 与 QML 生命周期需求间协调的注册表。QObject 现在按需附加到 #[qobject] 用户类型,用户不再需要调用 default_with_attached_qobject()。公开 API 仍以 Rc<RefCell<_>> 作为用户对象的容器和生命周期管理器,且其角色得到强化:任何 #[qobject] 类型的 Rc<RefCell<_>> 都能被 QmlEngine 理解,内部也由它负责用户对象的生命周期,降低了潜在问题。
升级注意事项与小型变更
从 0.2 升级若遇到链接错误,通常删除 Cargo.lock 和 target 目录即可解决。最低 Rust 版本要求为 1.88。其他值得注意的变更包括:QmlRegister 重命名为 QmlElement,用户实例 API 从 QObjectHolder 移至 QmlObject;Default 仅对 QML 元素必需;#[qobject(LinkMe)] 变为 crate 特性;invoke_method 按最派生优先解析并匹配参数;暴露具体 T* 元类型并注册槽返回元类型;include_bytes_q
Q&A
Qt Bridge for Rust 0.3 测试版的主要更新目标是什么?
主要目标是提升与 CXX-Qt 的兼容性和健全性。
Qt Bridge for Rust 0.3 在底层类型上做了哪些改变?
底层改用 CXX-Qt 的基础类型,包括 QString、QByteArray、QModelIndex、容器、QJson 类型、QGuiApplication 和 QQmlApplicationEngine。
0.3 版本在健全性方面做了哪些改进?
移除了不健全的 API(如 as_qvariant()),大量内部函数和 trait 标记为 unsafe,改进了错误处理:信号发射或修改模型在 QObject 附加前不再 panic,include_bytes_qml! 编译错误替代 panic 并正确解析路径。
所有权机制在 0.3 中是如何重构的?
引入了生命周期注册表来协调 Rust 和 QML 的生命周期需求,QObject 按需附加到 #[qobject] 用户类型,用户无需再调用 default_with_attached_qobject()。公共 API 仍使用 Rc<RefCell<_>> 作为容器和生命周期管理器,且其角色得到加强。
从 0.2 升级到 0.3 时需要注意哪些问题?
如果遇到链接错误,删除 Cargo.lock 和 target 目录;编译时间因迁移到 CXX-Qt 而显著增加,未来版本会优化。
0.3 版本有哪些较小的 API 变更?
QmlRegister 重命名为 QmlElement,用户实例 API 从 QObjectHolder 移到 QmlObject;Default 仅对 QML 元素必需;#[qobject(LinkMe)] 变为 crate 特性;invoke_method 按最派生优先解析并匹配参数;暴露具体 T* 元类型;include_bytes_qml! 接受目录;最低 Rust 版本为 1.88。