2016-09-23 86 views
0

我在QT 5.7中遇到了DBUS问题。QVariant到QDBusArgument

我收到一个变体,在该变体中,我知道有一个QVariantMap(即QMap,如果QVariantstrings索引)。

我在邮件中收到的是QVariant对象。我知道里面有一个QDBusArgument(调试器是这样说的,请参阅附加的图像),但我不知道什么是正确的方式来提取它,也不知道QVariantMap。

至于现在,我所做的是

QDBusArgument *darg = static_cast<QDBusArgument*>((void *)vm.data()); 
QVariantMap elems; 
*darg >> elems; 

,但我不知道这一点的办法,也不是我喜欢的静态浇铸。有其他选择吗?

问候

What the debugger say

编辑:

一个评论之后,我能够写一个 “更好” 的版本,qith qdbus_cast

QVariantMap elems = qdbus_cast<QVariantMap>(*(static_cast<QDBusArgument*>((void *)vm.data()))); 

然而,这没有回答我的问题,因为最重要的部分是关于static_cast(如果有一种方法可以避免它,因为它是不安全的)。

回答

1

QVariant类具有此方法,请参阅toMap()

正如文件所述,另请参阅canConvert()convert()

+0

已经尝试过。正如文档所说,toMap方法的工作原理是“如果变体具有type()QMetaType :: QVariantMap”。这个QVariant有一个类型id 1024(即用户类型,因为我是一个QDBusArgument),所以我不能用这个方法提取它(实际上,它返回一个空映射)。使用convert函数(如果我是对的)将一种类型转换为另一种类型,但我不能提取它.. – frarugi87

+0

我没有得到你的意思,我收到一个变体,并且在这个变体中我知道那么就有一个QVariantMap'。它是怎么来的,它有用户类型? – arrowd

+0

对不起,该帖子的其余部分应该更好地解释它。正如我后来写的那样,'QVariant'是一个'QDbusArgument',而INSIDE里有'QVariantMap'。这就是为什么我必须将内部数据转换为'QDBusArgument',然后提取地图。函数'toMap'意味着'QVariant'是'QVariantMap'' – frarugi87

0

提高铸件

QVariantMap elems = qdbus_cast<QVariantMap>(*(static_cast<QDBusArgument*>((void *)vm.data()))); 

我们可以使用value<T>()(或qvariant_cast

QVariantMap elems = qdbus_cast<QVariantMap>(vm.value<QDBusArgument>()); 
相关问题