通过 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 &lt;&lt;) 时,我收到一个错误,即 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 发送浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

难以从 Ctypes 返回浮点数

Java中怎么把浮点数转变成整数只保留整数部分

组态王使用485如何读取仪表浮点数?

1.4 浮点数

如何在shell中对浮点数进行计算