Qt QDbus Отправка пользовательских типов с QVariant

Я пытаюсь отправить собственный класс («Span») внутри QVariant через сессионную шину Dbus в Qt между двумя простыми приложениями. Span — это простой класс, который содержит 2 свойства двойного типа. Я успешно отправил и восстановил QVariant, содержащий только QString через интерфейс dbus, таким же образом, который я пытаюсь сделать ниже с QVariant пользовательского класса.

Span содержит следующее объявление для регистрации QVariant QMETATYPE в заголовочном файле класса:

Q_DECLARE_METATYPE(Span)

У меня есть 2 тестовых приложения, один отправитель и один получатель — оба имеют абсолютно одинаковые определения классов «Span». В моем приложении отправителя я делаю это:

qDebug() << "Sending QVariant Span to receiver...";
//int spanID = QMetaType::type("Span");
Span span(100,0.5);
//QVariant settingVariant(spanID, &span);
//QVariant settingVariant(QString("HELLO"));
QVariant settingVariant;
settingVariant.setValue(span);

QDBusVariant setting( settingVariant );
response = client->setSetting(setting);
qDebug() << "RESPONSE: " << response;

QVariant result = setting.variant(); // THIS WORKS - I can just extract my 'Span' here with the correct property values set
QVariant test = QVariant::fromValue(result);
Span testSpan = test.value<Span>();
qDebug() << "Setting Span to -- Low: " << testSpan.m_lowTemp
<< "High: " << testSpan.m_highTemp;

Метод setSetting определяется как:

inline QDBusPendingReply<int> setSetting(const QDBusVariant setting)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(setting);
return asyncCallWithArgumentList(QLatin1String("setSetting"), argumentList);
}

В приемнике я регистрирую класс Span следующим образом:

qRegisterMetaType<Span>();
qDBusRegisterMetaType<Span>();

и затем я пытаюсь восстановить класс Span следующим образом:

int DbusServerTemplate::setSetting( const QDBusVariant &setting ) {
QVariant result = setting.variant();
QVariant test = QVariant::fromValue(result);
Span stuff = test.value<Span>();
qDebug() << "Setting Span to -- Low: " << stuff.m_low
<< "High: " << stuff.m_high;

Приведенный выше код дает мне поддельные значения для свойств класса Span:

Setting Span to -- Low:  1.44144e-305 High:  5.24729e-261

Что я делаю неправильно? Я могу кодировать и декодировать экземпляр Span в приложении Sender, но как только класс получателя получит его через dbus, я получу поддельные значения. Буду очень признателен за любые идеи / помощь!

ПРИМЕЧАНИЕ. Я реализовал потоковые операторы в своем классе Span следующим образом (одна и та же реализация класса присутствует в приложении-получателе и отправителе):

// Simple getters for the low and high temps
double Span::getHighTemp() const { return m_high; }
double Span::getLowTemp() const { return m_low; }

// Marshall the Data data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const Span &span)
{
argument.beginStructure();

double high = span.getHighTemp();
double low = span.getLowTemp();
argument << high;
argument << low;
argument.endStructure();

return argument;
}

// Retrieve the Data data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, Span &span)
{
double high, low;

argument.beginStructure();
argument >> high;
argument >> low;
argument.endStructure();
span.m_high = high;
span.m_low = low;

return argument;
}

0

Решение

Задача ещё не решена.

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

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

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