【发布时间】:2018-04-19 22:46:36
【问题描述】:
我正在查询 NetworkManager 的org.freedesktop.NetworkManager.Settings.Connection 接口,在上面调用“GetSettings”。它以 Dbus 类型术语返回 Dict of {String, Dict of {String, Variant}} 或 a{sa{sv}}。我正在使用 QtCreator 和 Qt4 来构建我的应用程序。
我似乎无法从这本词典中得到一条有用的信息。 我无法提供 MVE,因为如果 NetworkManager 和 DBus 以及 Qt4 安装在某人的系统上,它会严重依赖。
这是我正在开发的从字符串字典和字符串和变体字典中获取信息的方法。将它传递到 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?,但我无法调整它来解析字典。
有人知道如何到达最后一个嵌套的 QVariant 吗?
【问题讨论】:
-
最好有 MCV 来帮助您...通过 qdbus 发送和接收 Dict 的非常简单的环境会大大提升您的工作量。顺便说一句,xml中“GetSettings”方法的定义是什么?