2016-09-23 28 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>()); 
相關問題