【问题标题】:Sending float over QDBus通过 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 数据类型?

【问题讨论】:

    标签: qt embedded-linux dbus


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多