在QDBus上发送浮动

Kur*_*tyn 5 qt dbus embedded-linux

我们目前从Qt 4.5.x迁移到4.7.3,从那时起我们在尝试通过DBus发送浮动时遇到错误('float'未注册为DBus类型).

例如:

QVariantList getTemperatures()  
{
    QVariantList retVal;
    retVal << getSensorValue(1) << getSensorValue(2);
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

getSensorValue是一个返回float值的方法.
由于4.6之前的版本中的QVariant只能包含一个double值,因此返回值会隐式转换为a 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
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试double流入QDBusArgument(operator <<)时,我得到一个错误,float数据类型试图覆盖double行为.
这也是正常的,因为底层QDbus系统已经将数据类型('f')流式传输到QDBusArgument,然后检测到a double正在进入流.

现在我的问题是:有没有人知道如何流式传输float,而不必在后端方法中替换所有float数据类型doubles

Aur*_*ien 0

(我首先创建了一个答案,我建议您使用beginStructure()andendStructure()以使 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;
}
Run Code Online (Sandbox Code Playgroud)