Qt DBus 属性转换为地图

Posted

技术标签:

【中文标题】Qt DBus 属性转换为地图【英文标题】:Qt DBus property convert to map 【发布时间】:2015-02-18 19:58:33 【问题描述】:

我需要得到一个 DBus 接口的属性,所以我做了interface.property(name)。这会返回一个 QVariant,但 QVariant 可以返回的映射只有QMap<QString, QVariant>,而我需要QMap<QString, QDBusVariant>。我该怎么办?

【问题讨论】:

在访问QMap<QString,QVariant> 的每个值时可能只是qvariant_cast<QDBusVariant>(map.value(key)) 它继承自它,所以我很确定演员阵容会起作用。 【参考方案1】:

我认为您正在寻找这种方法,因为没有 QVariant::toQDBusVariant() 方法,本质上是正确的:

T QVariant::​value() const

返回转换为模板类型T的存储值。调用canConvert()判断一个类型是否可以转换。如果该值无法转换,则返回一个默认构造的值。

如果 QVariant 支持类型 T,则此函数的行为与 toString()、toInt() 等完全相同。

根据您的用例,您可以一次性重建地图,也可以随时将其转换为您喜欢的类型。无论哪种方式,您都可以使用如上例所示的这种机制:

QVariant myVariant;
...
QDBusVariant dbusVariant;
if (myVariant.canConvert<QDBusVariant>())
    dbusVariant = myVariant.value<QDBusVariant>();

您也可以按照QDBusVariant 示例所示:

// retrieve the D-Bus variant
QDBusVariant dbusVariant = qvariant_cast<QDBusVariant>(v);

【讨论】:

【参考方案2】:

如果你想转换QMap 那么

QMap<QString,QVariant> variantMap(initializeVariantMapFunction());
QMap<QString,QDBusVariant> dbusVariantMap;
QMap<QString,QVariant>::const_iterator it;

for (it = variantMap.constBegin() ; it != variantMap.constEnd() ; ++it)
    dbusVariantMap.insert(it.key(), qvariant_cast<QDBusVariant>(it.value()));

但您当然可以保留 variantMap 原样,并在访问值时这样做

QDBusVariant someDBusVariant = qvariant_cast<QDBusVariant>(variantMap.value(key));

如果可能,您可以使用QVariant::canConvert 来检查是否转换。

【讨论】:

以上是关于Qt DBus 属性转换为地图的主要内容,如果未能解决你的问题,请参考以下文章

在java中运行时将DBus Variant的值转换为正确的类型

Qt编写的项目作品20-百度地图综合应用(在线+离线+区域)

如何在 Qt DBus 调用中从 QDBusMessage 中提取返回的数据?

使用 QDBusInterface 获取 DBus 接口属性时出错

尝试获取具有自定义类型的 DBus 属性时出现致命错误

带有连字符的 HTML 元素属性名称会自动转换为驼峰式