0

2 つの単純なアプリケーション間で、Qt の Dbus セッション バスを介して QVariant 内のカスタム クラス ( "Span" ) を送信しようとしています。Span は、2 つの double 型のプロパティを含む単純なクラスです。カスタム クラスの QVariant を使用して以下で行おうとしているのと同じ方法で、dbus インターフェイスを介して QString のみを含む 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);
}

レシーバーでは、次のように「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;
}
4

0 に答える 0