私が見つけた最も簡単な方法は、使用qDebug()
して結果を印刷することです。これは通常、最終的に最も内側の型に到達するまで、次に変換する必要がある型を示します。
Qdbusviewerは、必要な DBus パラメータを決定するための便利なツールです。この場合:
- WPAS サービス: "fi.w1.wpa_supplicant1"
- WPAS パス: "/fi/w1/wpa_supplicant1"
- プロパティ インターフェイス識別子: "org.freedesktop.DBus.Properties"
- WPAS インターフェース識別子: "fi.w1.wpa_supplicant1"
QDBusInterface
を呼び出すために を初期化する際には、メソッドを提供するインターフェイスであるため、インターフェイスGet
を使用する必要があり
ます
。Properties
Get
Get
メソッドを使用して呼び出す場合、2 番目と 3 番目のパラメーターは、イントロスペクションの出力 (および)QDBusInterface::call()
にリストされているパラメーターに対応します。プロパティを見つけることができる場所です(これはqdbusviewerを使用して確認できます)。"interface"
"propname"
"interface"
"Interfaces"
"fi.w1.wpa_supplicant1"
"propname"
パラメータはプロパティの名前です:
この"Interfaces"
場合。
これまでのコード:
std::string getInterface()
{
QDBusInterface interface( "fi.w1.wpa_supplicant1",
"/fi/w1/wpa_supplicant1",
"org.freedesktop.DBus.Properties",
QDBusConnection::systemBus() );
// Calls DBus method
QDBusMessage result = interface.call( "Get",
"fi.w1.wpa_supplicant1",
"Interfaces" );
これは難しい部分です。プロパティ情報がトラップされた をQDBusInterface::call()
返します。QDBusMessage
qDebug() << result;
このデバッグ ステートメントは次を出力します。
QDBusMessage(type=MethodReturn, service=":1.2431", signature="v", contents=([Variant: [ObjectPath: /fi/w1/wpa_supplicant1/Interfaces/7/Networks/0]]) )
いいね。「ObjectPath」は私たちが求めているものであり、間違いなくどこかにあります。
次に が必要ですQDBusMessage::arguments()
。これは、「送信される、または D-Bus から受信された引数のリストを返します」。を返しますQList<QVariant>
。
QList<QVariant> outArgs = result.arguments();
qDebug() << outArgs;
デバッグ ステートメントは次を出力します。
(QVariant(QDBusVariant, ) )
この「表記法」は少し不明確ですが (括弧はリストを意味しますか?)、続けます。
QVariant first = outArgs.at(0);
qDebug() << first;
プリント:
QVariant(QDBusVariant, )
したがって、外側の括弧は配列を示しているように見えますが、外側のセットではなく内側のセットにコンマが使用されている理由は少し謎です。
型に遭遇すると、型を変換し続けます。
QDBusVariant dbvFirst = first.value<QDBusVariant>();
//qDebug() << dbvFirst; // compile error!
qDebug()
は を理解していないためQDBusVariant
、ここではデバッグ プリントを利用できません。代わりに のドキュメント
を見ると、通常の型に変換する方法がQDBusVariant
提供されていることがわかります。variant()
QVariant
QVariant vFirst = dbvFirst.variant();
qDebug() << vFirst;
循環しているように見えますが、今回の印刷出力は少し異なります。
QVariant(QDBusArgument, )
別の変換:
QDBusArgument dbusArgs = vFirst.value<QDBusArgument>();
残念ながら、qDebug()
ここでも機能しません。タイプは、QtのQDBusArgument
ドキュメントで説明されているさまざまな要素タイプを保持できます。QDBusArgument::currentType()
あなたがどのタイプか教えてくれます。私たちの場合には:
qDebug() << "QDBusArgument current type is" << dbusArgs.currentType();
プリント:
QDBusArgument current type is 2
2 はArrayType
.
ドキュメントによるとQDBusArgument
、次のようなコードを使用して配列の要素を抽出できます。
QDBusObjectPath path;
dbusArgs.beginArray();
while (!dbusArgs.atEnd())
{
dbusArgs >> path;
// append path to a vector here if you want to keep it
}
dbusArgs.endArray();
配列要素の型はQDBusObjectPath
であると仮定しました。この時点では、そうであることが理にかなっているからです。私が正しいかどうかは明らかです。
エラー メッセージ が表示された場合はQDBusArgument: write from a read-only object
、 の宣言を次のように変更しますdbusArgs
。
const QDBusArgument &dbusArgs = vFirst.value<QDBusArgument>();
qDebug()
QDBusObjectPath
どちら
もサポートしていませんが、 をQDBusObjectPath::path()
返すQString
ので、次のようにデバッグ プリントを取得できます。
qDebug() << path.path();
プリント:
"/fi/w1/wpa_supplicant1/Interfaces/7"
やっと!