通过 QDBus 发送浮点数
Posted
技术标签:
【中文标题】通过 QDBus 发送浮点数【英文标题】:Sending float over QDBus 【发布时间】:2011-11-05 00:13:03 【问题描述】:我们目前从 Qt 4.5.x 迁移到 4.7.3,从那时起我们在尝试通过 DBus 发送浮点数时遇到错误('float' 未注册为 DBus 类型)。
例如:
QVariantList getTemperatures()
QVariantList retVal;
retVal << getSensorValue(1) << getSensorValue(2);
return retVal;
getSensorValue
是一个返回float
值的方法。
由于 4.6 之前的版本中的 QVariant 只能包含 double
值,因此返回值被隐式转换为 double
,并且 double
可以沿着 DBus 发送。
但是,从版本 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
但是,当我尝试将 double
流式传输到 QDBusArgument
(operator <<
) 时,我收到一个错误,即 float
数据类型试图覆盖 double
行为。
这也是正常的,因为底层 QDbus 系统已经将数据类型('f'
)流式传输到QDBusArgument
,然后检测到double
正在进入流中。
现在我的问题是:有人知道我如何流式传输这个float
,而不必在后端方法中用doubles
替换所有float
数据类型?
【问题讨论】:
【参考方案1】:(我最初创建了一个答案,我建议您使用 beginStructure()
和 endStructure()
以使 QtDBus 停止抱怨,但后来我意识到它并不能解决您的问题:您可能不想要将您的浮点数作为“结构中的双精度”传递,但只是作为双精度传递。)
当直接将浮点数传递给 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;
【讨论】:
以上是关于通过 QDBus 发送浮点数的主要内容,如果未能解决你的问题,请参考以下文章