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 中提取返回的数据?