2011-08-27 19 views
5

Obecnie migrowaliśmy z Qt 4.5.x do 4.7.3, i od tego czasu otrzymujemy błędy przy próbie wysłania wartości pływających przez DBus ("float" niezarejestrowany jako typ DBus).Wysyłanie zmiennoprzecinkowe nad QDBus

na przykład:

QVariantList getTemperatures() 
{ 
    QVariantList retVal; 
    retVal << getSensorValue(1) << getSensorValue(2); 
    return retVal; 
} 

getSensorValue jest metodą, która zwraca wartość float.
Ponieważ wersja QVariant w wersji wcześniejszej niż 4.6 mogła zawierać tylko wartość double, wartości zwracane były domyślnie rzutowane na double, a double może być wysyłane wzdłuż DBus. Ale od wersji 4,6 QVariant może zawierać float; w rezultacie moduł DBus narzeka, że ​​floats nie jest znanym typem danych - co jest poprawne.

próbowałem zarejestrować float typ danych, a do realizacji operatorom Streaming:

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 
} 

Ale gdy próbuję przesyłać strumieniowo double do QDBusArgument (operator <<), pojawia się błąd, że float typ danych próbuje zastąpić zachowanie double.
Jest to również normalne, ponieważ podstawowy system QDbus przekazał już typ danych ('f') do QDBusArgument, a następnie wykrywa, że ​​double wchodzi do strumienia.

A teraz moje pytanie: czy ktoś wie, w jaki sposób mogę przesyłać strumieniowo ten float, bez konieczności wymiany wszystkich typów float z doubles w metodach backendu?

Odpowiedz

0

(Stworzyłem na początku odpowiedź, w której sugerowałem, abyś użył beginStructure() i endStructure(), aby QtDBus przestał narzekać, ale wtedy zdałem sobie sprawę, że to nie rozwiązuje twojego problemu: prawdopodobnie nie chcesz przekazać swojego unoszą się jako "double in a structure", ale po prostu jako double.)

Podczas bezpośredniego przekazywania float do QDBusArgument zostaje on automatycznie rzucony w podwójne i nie ma problemu. Ale jeśli chcesz przekazać to za pomocą QVariantList, nie masz innego wyboru niż rzucenie go przed umieszczeniem go w QVariantList.

Jednak jeśli nie boisz brudnych rozwiązań można przeciążać operator wstawiania QVariantList niech to zrobi to za ciebie:

// 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; 
} 
+0

Jest to akceptowalne rozwiązanie dla mnie. Dzięki. –