2011-08-27 2 views
5

Nous avons actuellement migré de Qt 4.5.x à 4.7.3, et depuis lors nous obtenons des erreurs lorsque nous essayons d'envoyer des flottants sur DBus ('float' n'est pas enregistré comme type DBus).Envoi flottant sur QDBus

Par exemple:

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

getSensorValue est une méthode qui retourne une valeur float.
Puisqu'un QVariant dans la version antérieure à 4.6 ne pouvait contenir qu'une valeur double, les valeurs de retour étaient implicitement transtypées en double et un double pouvait être envoyé le long de DBus. Mais, depuis la version 4.6, un QVariant peut contenir un float; par conséquent, le module DBus se plaint que floats ne sont pas un type de données connu - ce qui est correct.

J'ai essayé d'enregistrer le float type de données, et de mettre en œuvre les opérateurs de diffusion en continu:

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 
} 

Mais, lorsque je tente de diffuser le double dans le QDBusArgument (operator <<), je reçois une erreur que le float type de données tente de contourner le comportement double.
Ceci est également normal, car le système QDbus sous-jacent a déjà transmis le type de données ('f') au QDBusArgument, puis détecte qu'un double entre dans le flux.

Et maintenant ma question: Quelqu'un sait comment je pourrais diffuser ce float, sans avoir à remplacer tous les float avec doubles dans datatypes les méthodes de back-end?

Répondre

0

(J'avais d'abord créé une réponse où je vous suggérais d'utiliser beginStructure() et endStructure() pour que QtDBus cesse de se plaindre mais je me suis rendu compte que cela ne résout pas votre problème: vous ne voulez probablement pas passer votre float comme un "double dans une structure" mais simplement comme un double.)

Lorsque vous passez directement le flottant à l'objet QDBusArm, il est automatiquement converti en double et il n'y a pas de problème. Mais si vous voulez passer à travers une QVariantList, vous n'avez pas d'autre choix que de le lancer avant de le placer dans QVariantList.

Toutefois, si vous n'êtes pas peur par des solutions sales, vous pouvez surcharger l'opérateur d'insertion de QVariantList de le laisser faire pour vous:

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

C'est une solution acceptable pour moi. Merci. –