2011-08-27 21 views
5

我们目前从Qt的4.5.x迁移到4.7.3,从那以后,我们得到的错误尝试过的DBus(“浮动”未注册为的DBus型)发送彩车时。发送浮在QDBus

例如:

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

getSensorValue是一个返回float值的方法。
由于4.6版本之前版本中的QVariant只能包含double值,因此返回值隐式转换为double,并且可以沿着DBus发送double。 但是,从版本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 
} 

但是,当我尝试流的doubleQDBusArgumentoperator <<),我得到一个错误的float数据类型正试图覆盖double行为。
这也是正常的,因为底层的QDbus系统已经将数据类型('f')流式传输到QDBusArgument,然后检测到double正在进入流。

现在我的问题:没有任何人知道我怎么会流这个float,而不必在后端方法doubles全部更换float数据类型?

回答

0

(我最初创建了一个答案,我建议您使用beginStructure()endStructure()以使QtDBus停止抱怨,但后来我意识到它不能解决您的问题:您可能不希望传递浮动作为一个“在一个结构的双”,而只是为double。)

当直接传递浮到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; 
} 
+0

这是对我来说是可以接受的解决方案。谢谢。 –