加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

qt – 在QDBus上发送浮动

发布时间:2020-12-14 01:39:30 所属栏目:Linux 来源:网络整理
导读:我们目前从Qt 4.5.x迁移到4.7.3,从那时起我们在尝试通过DBus发送浮动时遇到错误(‘float’未注册为DBus类型). 例如: QVariantList getTemperatures() { QVariantList retVal; retVal getSensorValue(1) getSensorValue(2); return retVal;} getSensorValue
我们目前从Qt 4.5.x迁移到4.7.3,从那时起我们在尝试通过DBus发送浮动时遇到错误(‘float’未注册为DBus类型).

例如:

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读