首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过QDBus发送浮动

通过QDBus发送浮动
EN

Stack Overflow用户
提问于 2011-08-27 15:55:16
回答 1查看 1K关注 0票数 5

我们目前从Qt 4.5.x迁移到4.7.3,从那时起我们在尝试通过DBus发送浮点数('float‘没有注册为DBus类型)时得到错误。

例如:

代码语言:javascript
复制
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数据类型,并实现流运算符:

代码语言:javascript
复制
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数据类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-13 07:29:58

(我最初创建了一个答案,我建议您使用beginStructure()endStructure(),以便让QtDBus停止抱怨,但后来我意识到这并不能解决您的问题:您可能不想将浮点数作为“结构中的双精度”传递,而只是简单地作为双精度。)

当直接将浮点数传递给QDBusArgument时,它会自动转换为双精度值,没有任何问题。但是,如果您想通过QVariantList传递它,除了在将它放入QVariantList之前强制转换它之外,您别无选择。

但是,如果您不怕糟糕的解决方案,您可以重载QVariantList的插入操作符,让它为您完成此操作:

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7213250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档