Qt QDbus使用QVariant发送自定义类型

时间:2012-12-29 22:39:56

标签: c++ qt dbus qvariant qdbus

我正在尝试在两个简单的应用程序之间在Qt中跨越Dbus会话总线在QVariant中发送自定义类(“Span”)。 Span是一个包含2个double类型属性的简单类。我已成功发送并恢复了一个在dbus接口上只包含一个QString的QVariant,就像我在下面尝试使用自定义类的QVariant一样。

Span在类头文件中包含以下QMETATYPE QVariant注册声明:

Q_DECLARE_METATYPE(Span)

我有2个测试应用程序,一个发送者和一个接收者 - 两者都具有完全相同的'Span'类定义。在我的发件人应用程序中,我这样做:

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);
}

在接收器中,我注册了'Span'类,如下所示:

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;
}

0 个答案:

没有答案