我们目前从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
,并且可以沿着DBus发送double
。
但是,从版本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
数据类型试图覆盖{{}的错误1}}行为。
这也是正常的,因为底层QDbus系统已经将数据类型(double
)流式传输到'f'
,然后检测到QDBusArgument
正在进入流。
现在我的问题是:是否有人知道如何流式传输此double
,而无需在后端方法中用float
替换所有float
数据类型?
答案 0 :(得分:0)
(我首先创建了一个答案,我建议你使用beginStructure()
和endStructure()
来让QtDBus停止抱怨,但后来我意识到它并没有解决你的问题:你可能不想把你的浮动作为一个结构中的&#34; double传递给#34;而只是作为一个双重传递。)
当直接将浮点数传递给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;
}