当前位置: 首页 > article >正文

【CXX-Qt】2.3 类型

CXX-Qt 支持大多数 CXX 支持的类型。这些类型可以用于属性、可调用方法和信号中。

cxx-qt-lib 类型

cxx-qt-lib crate 提供了常见 Qt 类型的 CXX 绑定。

使用 cxx-qt-lib 文档 来探索可用的类型。

容器类型

cxx-qt-lib crate 提供了容器类型,例如 QSet。

要使用这些类型,请在 CXX 桥接中定义一个模板化类型,但请注意,类型名称必须为 QSet_T,因为这需要与 C++ 代码中的名称匹配。

例如,对于 QSet,类型名称应为 QSet_i32。

unsafe extern "C++" {
    include!("cxx-qt-lib/qset.h");
    type QSet_i32 = cxx_qt_lib::QSet<i32>;
}

对于基于键值的容器类型(如 QHash<K, V>),需要在 Rust 端定义一个中间类型,以便为键值组合实现 trait。

与其他容器类型一样,类型名称必须为 QHash_K_V,因为这需要与 C++ 代码中的名称匹配。

例如,对于 QHash<QString, QVariant>,定义一个名为 QHashPair_QString_QVariant 的中间类型。然后使用类型名称 QHash_QString_QVariant 来匹配 C++ 端。

unsafe extern "C++" {
    include!("cxx-qt-lib/qhash.h");
    type QHash_QString_QVariant = cxx_qt_lib::QHash<cxx_qt_lib::QHashPair_QString_QVariant>;
}

请注意,可以通过在 Rust 中使用匹配的类型(例如 QMap<QString, QVariant>)来使用类型别名(如 QVariantMap)。

定义自定义类型

任何有效的 CXX 类型都应该可以与 CXX-Qt 一起使用。

请注意,适用与 CXX 相同的规则,因此类型必须是可平凡传递的。如果它们是不透明类型,则必须使用引用或指针。

有关如何包装 Qt 对象的示例,请参阅 cxx-qt-lib 源代码。

在容器或 QVariant 中使用自定义类型

要在容器中使用自定义类型,请找到容器使用的 trait。例如,对于 QSet,有一个 QSetElement trait;对于 QHash<K, V>,有一个 QHashPair trait。

为你的自定义类型实现相应的 trait,然后就可以像上面描述的那样使用容器。

要在 QVariant 中使用自定义类型,请为你的自定义类型实现 QVariantValue trait,如下所示,然后就可以正常使用了。

impl cxx_qt_lib::QVariantValue for ffi::CustomStruct {
    fn can_convert(variant: &cxx_qt_lib::QVariant) -> bool {
        ffi::qvariant_can_convert_custom_type(variant)
    }

    fn construct(value: &Self) -> cxx_qt_lib::QVariant {
        ffi::qvariant_construct_custom_type(value)
    }

    fn value_or_default(variant: &cxx_qt_lib::QVariant) -> Self {
        ffi::qvariant_value_or_default_custom_type(variant)
    }
}

在 qml_features 类型示例 中展示了如何使用 QVariant 实现自定义结构体的完整示例。

此外,任何 C++ 中的自定义类型或别名都应使用 qRegisterMetaType(“TYPE”) 在 Qt 中注册,以确保它们可以与 QML 一起使用。


http://www.kler.cn/a/596555.html

相关文章:

  • 网站蜜罐部署与攻击追踪方案
  • 【指针(2)-- 使用指针的技巧】
  • 人工智能在智能交通中的应用:以L4级无人电动物流拖车为例
  • 解析DeepSeek的技术内核:混合专家架构如何重塑AI效能
  • 【第16章】亿级电商平台订单系统-部署架构设计
  • 蓝桥杯备考:模拟题之神奇的幻方
  • 2025年渗透测试面试题总结- shopee-安全工程师(题目+回答)
  • asp.net core mvc模块化开发
  • 网络知识编-数据链路层(以太网 局域网通信 ARP协议 ARP 欺骗 DDos 攻击)
  • Linux系统管理与编程07:任务驱动综合应用
  • 蓝牙AOA定位技术:开启车辆精准定位的智能新时代
  • MySQL数据库精研之旅第二期:库操作的深度探索
  • python:AI+ music21 构建 LSTM 模型生成爵士风格音乐
  • 【Java篇】静动交融,内外有别:从静态方法到内部类的深度解析
  • 单表达式倒计时工具:datetime的极度优雅(DeepSeek)
  • C++异常处理完全指南:从原理到实战
  • vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】
  • 红宝书第八讲:箭头函数与高阶函数:厨房工具与智能菜谱的对比
  • 3月22日星期六今日早报简报微语报早读
  • java项目之基于ssm的游戏攻略网站(源码+文档)