2016-09-23 2 views
0

У меня проблема с DBUS в QT 5.7.QVariant to QDBusArgument

получает вариант, и внутри этого варианта я знаю, что есть QVariantMap (т.е. если QMapQVariant с проиндексировано strings).

То, что я получаю в сообщении, является объектом QVariant. Я знаю, что внутри него есть QDBusArgument (отладчик говорит так, см. Прикрепленное изображение), но я не знаю, что это правильный способ его извлечь, или QVariantMap.

А теперь, что я сделал это

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

, но я не уверен, что такой подход, и я, как статический бросок. Есть ли альтернатива?

С наилучшими пожеланиями

What the debugger say

EDIT:

После одного комментария, я был в состоянии написать "красивее" версии, qith qdbus_cast:

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

Это, однако, не отвечает на мой вопрос, так как самая важная часть была о static_cast (и если бы был способ избежать это, поскольку это небезопасно).

ответ

1

Класс QVariant имеет метод для этого, см. toMap().

И как указано в документации, см. Также canConvert() и convert().

+0

Уже пробовали. Как сказано в документации, метод toMap работает «если у варианта есть тип() QMetaType :: QVariantMap». Этот QVariant имеет тип wit id 1024 (то есть тип пользователя, поскольку i является QDBusArgument), поэтому я не могу извлечь его с помощью этого метода (фактически, он возвращает пустую карту). Функция конвертирования используется (если я прав), чтобы отличать один тип от другого, но я не могу его извлечь .. – frarugi87

+0

Я не понял, что вы имели в виду под «Я получаю вариант, и внутри этого варианта я знаю тогда есть QVariantMap'. Как получается, что у него есть пользовательский тип? – arrowd

+0

Извините, остальная часть сообщения должна была объяснить это лучше. Как я писал позже, «QVariant» - это «QDbusArgument», а внутри него есть «QVariantMap». Вот почему мне пришлось отбросить внутренние данные в 'QDBusArgument', а затем извлечь карту. Функция 'toMap' подразумевает' QVariant' IS '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>()); 
Смежные вопросы