0

dbus からプロパティ値を取得しようとしています。エラーは発生していませんが、正しい値も取得していません。つまり、返される値は、qdbus によって返される値と同じではありません。これが私のコードです:

   const QString service = "org.freedesktop.UPower";
   const QString path = "/org/freedesktop/UPower/devices/line_power_ADP1";
   const QString interface = "org.freedesktop.UPower.Device"; 
   const QString property = "Online";    

   QDBusConnection bus = QDBusConnection::systemBus();

   QList<QVariant> args;
   args.append(QVariant(interface));
   args.append(QVariant(property));

   QDBusMessage mesg = QDBusMessage::createMethodCall(service, path, "org.freedesktop.DBus.Properties", "Get");
   mesg.setArguments(args);   

   QDBusMessage ret = bus.call(mesg);

   if (ret.type() == QDBusMessage::ErrorMessage)
   {
       qDebug() << "Error getting property value.  " << ret.errorName() <<  ":  " << ret.errorMessage();
   }

   bool value = ret.arguments()[0].value<bool>(); //incorrect value!

私が知る限り、これはシステム バス上のサービス「org.freedesktop.UPower」のパス「/org/freedesktop/UPower/devices/line_power_ADP1」に対応する「オンライン」プロパティを取得するはずです。しかし実際には、得られるのはがらくただけです。エラーはなく、がらくただけです。

4

1 に答える 1

0

ああ...まあ、どうやら(混乱させるために笑)、dbusは情報を「QDBusVariant」として送信します。したがって、QDBusMessage 出力の「QVariant」を「QDBusVariant」に変換してから「QVariant」に戻し、それを実際の値 (この場合は「bool」) に変換する必要があります。言い換えれば、私は使用する必要がありました:

bool value = ret.arguments()[0].value<QDBusVariant>().variant().value<bool>(); 

それ以外の

bool value = ret.arguments()[0].value<bool>(); 
于 2015-01-18T01:56:46.410 に答える