>我正在尝试从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"相对应的"Online"属性。 但实际上,它得到的只是垃圾——没有错误,只有垃圾。
啊...好吧,显然(只是为了混淆,哈哈)dbus 将信息作为"QDBusVariant"发送。 所以我需要将 QDBusMessage 输出的"QVariant"转换为"QDBusVariant",然后再转换回"QVariant",然后将其转换为实际值(在本例中为"bool")。 换句话说,我应该使用:
bool value = ret.arguments()[0].value<QDBusVariant>().variant().value<bool>();
而不是
bool value = ret.arguments()[0].value<bool>();