У меня проблема с DBUS в QT 5.7.QVariant to QDBusArgument
получает вариант, и внутри этого варианта я знаю, что есть QVariantMap
(т.е. если QMap
QVariant
с проиндексировано strings
).
То, что я получаю в сообщении, является объектом QVariant
. Я знаю, что внутри него есть QDBusArgument (отладчик говорит так, см. Прикрепленное изображение), но я не знаю, что это правильный способ его извлечь, или QVariantMap.
А теперь, что я сделал это
QDBusArgument *darg = static_cast<QDBusArgument*>((void *)vm.data());
QVariantMap elems;
*darg >> elems;
, но я не уверен, что такой подход, и я, как статический бросок. Есть ли альтернатива?
С наилучшими пожеланиями
EDIT:
После одного комментария, я был в состоянии написать "красивее" версии, qith qdbus_cast
:
QVariantMap elems = qdbus_cast<QVariantMap>(*(static_cast<QDBusArgument*>((void *)vm.data())));
Это, однако, не отвечает на мой вопрос, так как самая важная часть была о static_cast
(и если бы был способ избежать это, поскольку это небезопасно).
Уже пробовали. Как сказано в документации, метод toMap работает «если у варианта есть тип() QMetaType :: QVariantMap». Этот QVariant имеет тип wit id 1024 (то есть тип пользователя, поскольку i является QDBusArgument), поэтому я не могу извлечь его с помощью этого метода (фактически, он возвращает пустую карту). Функция конвертирования используется (если я прав), чтобы отличать один тип от другого, но я не могу его извлечь .. – frarugi87
Я не понял, что вы имели в виду под «Я получаю вариант, и внутри этого варианта я знаю тогда есть QVariantMap'. Как получается, что у него есть пользовательский тип? – arrowd
Извините, остальная часть сообщения должна была объяснить это лучше. Как я писал позже, «QVariant» - это «QDbusArgument», а внутри него есть «QVariantMap». Вот почему мне пришлось отбросить внутренние данные в 'QDBusArgument', а затем извлечь карту. Функция 'toMap' подразумевает' QVariant' IS 'QVariantMap' – frarugi87