2017-11-07 2 views
1

NetworkManagerのorg.freedesktop.NetworkManager.Settings.Connectionインターフェイスに「GetSettings」を呼び出してクエリを実行しています。 Dbusタイプの用語でDict of {String, Dict of {String, Variant}}またはa{sa{sv}}を返します。私はアプリケーションを構築するためにQt4でQtCreatorを使用しています。{String、{String、Variant}}のDictをQDBusで構文解析するにはどうすればよいですか?

私はこの辞書から有用な情報を得ることができません。 NetworkManagerとDBusとQt4が他のシステムにインストールされている場合、MVEを大きく依存しているため、MVEを提供することはできません。

ここでは、このストリングの辞書とストリングとバリアントの辞書から情報を得るために開発している方法を示します。私はそれをqDebug()にパイプするときに必要な素敵なデータをすべて見ることができます:qDebug()<<reply

void GetInfo() 
{ 
    //sysbus just means the system DBus. 
    QDBusInterface connSettings("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings/1", "org.freedesktop.NetworkManager.Settings.Connection", sysbus); 
    QDBusMessage reply = connections.call("GetSettings"); 
    if(reply.type() == QDBusMessage::ReplyMessage) 
    { 
     //I have tried everything I can imagine here, 
     //QVariant g = reply.arguments().at(0).value<QVariant>(); did not work 
     //g.canConvert<QMap>(); returns false, in contrast to what KDE says. 
     //QDbusArgument g = query.arguments().at(0).value<QDBusArgument>(); 
     //g.beginMap(); and such don't work 
    } 
} 

Dictタイプの解析に関する情報を見つけるのは非常に困難です。私が見つけた唯一の情報源は、KDEです。 「DBus DictタイプはQMapにマップする必要があります」という例です.Googleやその他の例ではヒットしません。たぶん私は基礎的なDBusの知識が不足しているかもしれませんが、私は困惑しています。

また、私はこの優れた答えをチェックアウトしました:How do I extract the returned data from QDBusMessage in a Qt DBus call?しかし、私はdictを解析するためにそれを適応させることができませんでした。

最後にネストされたQVariantに到達する方法を知っていますか?

+0

あなたを助けるためにMCVを持っている方が良いだろう...非常に単純な環境qdbus上でDictを送受信すると、あなたの作業が大幅にエスカレートします。 Btw xmlの "GetSettings"メソッドの定義は何ですか? – miradham

答えて

2

残念ながら、Qts DBUS APIは常に理解するのが最も簡単なわけではないので、ここでいくつかのヒントを紹介します。基本的には、私のために働くことがわかったのは、返信からDBusArgumentを取得しなければならないということです。実際のデータを取得するために実際に使用されているものです。抽出する内容に応じて、.cppファイル(the documentation for QDBusArgument says how to do this)にoperator<<operator>>を上書きするか、抽出するタイプを定義することができます。注意すべきもう1つの重要なことは、応答かコールかによって、QDBusReply::arguments()contains eitherまたはを受け取り、引数を受け取るということです。 (Qt5でいえ、私はそれが同様Qt4版で働く必要があることを期待して)とにかく

、私のために、次の作品

QDBusInterface connSettings("org.freedesktop.NetworkManager", 
          "/org/freedesktop/NetworkManager/Settings/1", 
          "org.freedesktop.NetworkManager.Settings.Connection", 
          QDBusConnection::systemBus()); 
QDBusMessage reply = connSettings.call("GetSettings"); 

qDebug() << "Reply below:"; 
qDebug() << reply; 

qDebug() << "Extracted: "; 

// Extract the argument from the reply 
// In this case, we know that we get data back from the method call, 
// but a range check is good here as well(also to ensure that the 
// reply is a method reply, not an error) 
const QDBusArgument &dbusArg = reply.arguments().at(0).value<QDBusArgument>(); 

// The important part here: Define the structure type that we want to 
// extract. Since the DBus type is a{sa{sv}}, that corresponds to a 
// Map with a key of QString, which maps to another map of 
// QString,QVariant 
QMap<QString,QMap<QString,QVariant> > map; 
dbusArg >> map; 
qDebug() << "Map is: " << map; 

// We're just printing out the data in a more user-friendly way here 
for(QString outer_key : map.keys()){ 
    QMap<QString,QVariant> innerMap = map.value(outer_key); 

    qDebug() << "Key: " << outer_key; 
    for(QString inner_key : innerMap.keys()){ 
     qDebug() << " " << inner_key << ":" << innerMap.value(inner_key); 
    } 
} 
+0

もしそれが役に立つなら、答えを受け入れることを忘れないでください! – rm5248

関連する問題