В настоящее время мы мигрировали с Qt 4.5.x на 4.7.3, и с тех пор мы получаем ошибки при попытке отправить плавающие объекты через DBus ('float' не зарегистрирован как тип DBus).
Например:
QVariantList getTemperatures()
{
QVariantList retVal;
retVal << getSensorValue(1) << getSensorValue(2);
return retVal;
}
getSensorValue
- это метод, который возвращает значение float
.
Поскольку QVariant в версии до 4.6 может содержать только double
значение, возвращаемые значения были неявно приведены к double
, а double
может быть отправлено по DBus.Но, начиная с версии 4,6, QVariant может содержать float
;В результате модуль DBus жалуется на то, что floats
не является известным типом данных - что является правильным.
Я попытался зарегистрировать тип данных float
и реализовать операторы потоковой передачи:
qDBusRegisterMetaType<float>();
QDBusArgument &operator<<(QDBusArgument &argument, const float &myFloat)
{
return argument << static_cast<double>(myFloat);
}
const QDBusArgument &operator>>(const QDBusArgument &argument, float &myFloat)
{
double d;
argument >> d;
myFloat = static_cast<float>(d);
return argument
}
Но, когда я пытаюсь передать поток double
в QDBusArgument
(operator <<
), я получаю ошибку, что тип данных float
пытается переопределить поведение double
.
Этоэто также нормально, потому что базовая система QDbus уже передала тип данных ('f'
) в QDBusArgument
, а затем обнаруживает, что double
входит в поток.
И теперь мой вопрос:Кто-нибудь знает, как я мог бы передать это float
, не заменяя все float
типов данных на doubles
в методах бэкэнда?