Qt DBus отменяет маршалинг при отправке в виде QDBusVariant / QVariant

Учебный класс Dummy, происходит от QObject, зарегистрирован

Q_DECLARE_METATYPE(Dummy)
qRegisterMetaType<Dummy>("Dummy");
qDBusRegisterMetaType<Dummy>();

Когда я отправляю Dummy как QDBusVariant, слот правильно называется, но значение (из Dummy) по умолчанию. Заметили, что оператор демаршаллинга никогда не вызывается (маршаллинг есть). С помощью DBusMonitor Я вижу, что значение отправлено правильно.

Я предполагаю, что это не удается, потому что оператор QDBusArgument &operator<<(const QDBusVariant &arg); вызывается и работает только против стандартных типов Qt. Если я заверну QString в QVariant в QDBusVariant это работает отлично.

Как можно решить проблему?

/*!
* \brief operator << Marshalling
* \param argument
* \param dummy
* \return
*/
QDBusArgument &operator<<(QDBusArgument &argument, const Dummy& dummy)
{
argument.beginStructure();
argument << dummy.m_number; // qint32
argument << dummy.m_string; // QString
argument.endStructure();
qDebug() << "Marshall to DBus" << dummy.m_number << dummy.m_string;
return argument;
}

/*!
* \brief operator >> unmarshalling
* \param argument
* \param dummy
* \return
*/
const QDBusArgument &operator>>(const QDBusArgument &argument, Dummy &dummy)
{
argument.beginStructure();
argument >> dummy.m_number;
argument >> dummy.m_string;
argument.endStructure();
qDebug() << "Unmarshall from DBus" << dummy.m_number << dummy.m_string;
return argument;
}

Посылка:

        Dummy dummy(c++, "Moep");
qDebug() << "Dummy is" << dummy;
QVariant qv;
qv.setValue(dummy);
QDBusVariant qdv = QDBusVariant(qv);
testserviceInterface.receiveVariant(qdv);

Примечания:

  1. Qt 5.1 Win32
  2. Здесь описывается аналогичная проблема без ответа на дату публикации: Qt QDbus Отправка пользовательских типов с QVariant

0

Решение

Хитрость в том, что полученный QVariant для сложных типов имеет тип QDBusArgument, Если возможно отменять маршалинг до желаемого целевого типа, то способ сделать это: qv.value<QDBusArgument>() >> someConcreteObject

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]