Отправка поплавка через QDBus - PullRequest
5 голосов
/ 27 августа 2011

В настоящее время мы мигрировали с 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 в методах бэкэнда?

1 Ответ

0 голосов
/ 13 января 2013

(Сначала я создал ответ, в котором предложил использовать beginStructure() и endStructure(), чтобы QtDBus прекратил жаловаться, но потом понял, что это не решит вашу проблему: вы, вероятно, не хотите передать ваш float как «двойник в структуре», но просто как двойник.)

При передаче плавающего напрямую в QDBusArgument он автоматически преобразуется в двойное число, и проблем нет. Но если вы хотите передать его через QVariantList, у вас нет другого выбора, кроме как привести его в заблуждение до помещения его в QVariantList.

Однако, если вы не боитесь грязных решений, вы можете перегрузить оператор вставки QVariantList, чтобы он сделал это за вас:

// g++ -o main main.cpp -lQtCore -lQtDBus

#include <QtDBus/QDBusArgument>

QVariantList & operator<<(QVariantList & list, const float & f)
{
    QVariant variant(static_cast<double>(f));
    list << variant;
    return list;
}

int main()
{
    QDBusArgument test;
    QVariantList list;
    float f = 1.0;
    list << f;
    test << list; // doesn't trigger any error
    return 0;
}
...