2011-08-27 16 views
5

Actualmente migramos de Qt 4.5.x a 4.7.3, y desde entonces obtenemos errores cuando intentamos enviar flotantes a través de DBus ('float' no registrado como tipo DBus).Enviando float sobre QDBus

Por ejemplo:

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

getSensorValue es un método que devuelve un valor float.
Dado que un QVariant en la versión anterior a 4.6 solo podía contener un valor double, los valores devueltos se convertían implícitamente en double, y se puede enviar un double a lo largo del DBus. Pero, desde la versión 4,6, un QVariant puede contener un float; como resultado, el módulo DBus se queja de que floats no es un tipo de datos conocido, que es correcto.

Me trataron de registrar el tipo de datos float, y para poner en práctica los operadores de transmisión:

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 
} 

Pero, cuando trato de transmitir los double en el QDBusArgument (operator <<), me sale un error que el float tipo de datos está intentando anular el comportamiento double.
Esto también es normal, porque el sistema QDbus subyacente ya ha transmitido el tipo de datos ('f') al QDBusArgument, y luego detecta que un double está ingresando a la transmisión.

Y ahora mi pregunta: ¿Alguien sabe cómo podría transmitir esta float, sin tener que reemplazar todos los tipos de datos con floatdoubles en los métodos de back-end?

Respuesta

0

(que había creado en un primer momento una respuesta en la que sugirió que utilice beginStructure() y endStructure() con el fin de hacer QtDBus dejar de quejarse, pero luego me di cuenta de que no soluciona el problema: es probable que no quiere pasar su flotante como un "doble en una estructura" pero simplemente como un doble.)

Al pasar directamente el flotador al QDBusArgument, se convierte automáticamente en un doble y no hay ningún problema. Pero si desea pasarlo a través de QVariantList, no tiene más remedio que enviarlo antes de colocarlo en QVariantList.

Sin embargo, si usted no tiene miedo de soluciones sucias que puede sobrecargar el operador de inserción de QVariantList dejar que lo haga por usted:

// 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

Esta es una solución aceptable para mí. Gracias. –