1

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

4

2 回答 2

1

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

T QVariant::​value() 常量

返回转换为模板类型 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);
于 2014-12-19T21:05:11.840 回答
0

如果你想转换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检查是否转换。

于 2014-12-19T21:10:51.530 回答