例如:
QVariantList getTemperatures() { QVariantList retVal; retVal << getSensorValue(1) << getSensorValue(2); return retVal;}
getSensorValue是一个返回floatvalue的方法.
由于4.6之前的版本中的QVariant只能包含double值,因此返回值会隐式转换为double,并且可以沿DBus发送double.
但是,从版本4,6开始,QVariant可以包含一个浮点数;因此,DBus模块抱怨浮点数不是已知的数据类型 – 这是正确的.
我尝试注册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数据类型试图覆盖双重行为.
这也是正常的,因为底层QDbus系统已经将数据类型(‘f’)流式传输到QDBusArgument,然后检测到双正在进入流.
现在我的问题是:有没有人知道如何流式传输这个浮点数,而不必在后端方法中用双精度替换所有浮点型数据类型?
解决方法 (我最初创建了一个答案,我建议你使用beginStructure()和endStructure()以使QtDBus停止抱怨,但后来我意识到它并没有解决你的问题:你可能不想通过你的浮动为“结构中的双重”,但只是一个双重.)当直接将浮点数传递给QDBusArgument时,它会自动转换为double,并且没有问题.但是如果你想通过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;}总结
以上是内存溢出为你收集整理的qt – 在QDBus上发送浮动全部内容,希望文章能够帮你解决qt – 在QDBus上发送浮动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)