我正在尝试通过 Qt 中的 Dbus 会话总线在 2 个简单应用程序之间的 QVariant 内发送自定义类(“Span”)。Span 是一个包含 2 个双精度类型属性的简单类。我已经成功地通过 dbus 接口发送并恢复了一个仅包含 QString 的 QVariant,就像我在下面尝试使用自定义类的 QVariant 一样。
Span 在类头文件中包含以下 QMETATYPE QVariant 注册声明:
Q_DECLARE_METATYPE(Span)
我有 2 个测试应用程序,一个发送者和一个接收者 - 两者都具有完全相同的“跨度”类定义。在我的发件人应用程序中,我这样做:
qDebug() << "Sending QVariant Span to receiver...";
//int spanID = QMetaType::type("Span");
Span span(100,0.5);
//QVariant settingVariant(spanID, &span);
//QVariant settingVariant(QString("HELLO"));
QVariant settingVariant;
settingVariant.setValue(span);
QDBusVariant setting( settingVariant );
response = client->setSetting(setting);
qDebug() << "RESPONSE: " << response;
QVariant result = setting.variant(); // THIS WORKS - I can just extract my 'Span' here with the correct property values set
QVariant test = QVariant::fromValue(result);
Span testSpan = test.value<Span>();
qDebug() << "Setting Span to -- Low: " << testSpan.m_lowTemp
<< "High: " << testSpan.m_highTemp;
'setSetting' 方法定义为:
inline QDBusPendingReply<int> setSetting(const QDBusVariant setting)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(setting);
return asyncCallWithArgumentList(QLatin1String("setSetting"), argumentList);
}
在接收器中,我像这样注册“跨度”类:
qRegisterMetaType<Span>();
qDBusRegisterMetaType<Span>();
然后我尝试像这样恢复 Span 类:
int DbusServerTemplate::setSetting( const QDBusVariant &setting ) {
QVariant result = setting.variant();
QVariant test = QVariant::fromValue(result);
Span stuff = test.value<Span>();
qDebug() << "Setting Span to -- Low: " << stuff.m_low
<< "High: " << stuff.m_high;
上面的代码给了我 Span 类属性的虚假值:
Setting Span to -- Low: 1.44144e-305 High: 5.24729e-261
我究竟做错了什么?我可以在 Sender 应用程序中对 Span 实例进行编码和解码,但是一旦接收器类通过 dbus 获取它,我就会得到虚假值。我真的很感激任何想法/帮助!
注意:我确实在我的 Span 类中实现了流式操作符,如下所示(接收方和发送方应用程序中都存在相同的类实现):
// Simple getters for the low and high temps
double Span::getHighTemp() const { return m_high; }
double Span::getLowTemp() const { return m_low; }
// Marshall the Data data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const Span &span)
{
argument.beginStructure();
double high = span.getHighTemp();
double low = span.getLowTemp();
argument << high;
argument << low;
argument.endStructure();
return argument;
}
// Retrieve the Data data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, Span &span)
{
double high, low;
argument.beginStructure();
argument >> high;
argument >> low;
argument.endStructure();
span.m_high = high;
span.m_low = low;
return argument;
}