gpt4 book ai didi

qt - 通过 QDBus 发送 float

转载 作者:行者123 更新时间:2023-12-03 17:58:22 25 4
gpt4 key购买 nike

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

例如:

QVariantList getTemperatures()  
{
QVariantList retVal;
retVal << getSensorValue(1) << getSensorValue(2);
return retVal;
}
getSensorValue是一个返回 float 的方法值(value)。
由于 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 << ),我收到一个错误,即 float数据类型试图覆盖 double行为。
这也是正常的,因为底层 QDbus 系统已经将数据类型( 'f' )流式传输到 QDBusArgument ,然后检测到 double正在进入流。

现在我的问题是:有人知道我如何流式传输 float ,而无需全部替换 float doubles 的数据类型在后端方法中?

最佳答案

(我最初创建了一个答案,我建议您使用 beginStructure()endStructure() 以使 QtDBus 停止提示,但后来我意识到它并不能解决您的问题:您可能不想通过您的float 作为“结构中的 double ”,但只是作为 double 。)

当直接将浮点数传递给 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;
}

关于qt - 通过 QDBus 发送 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com