我发现最简单的方法是使用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 的接口
方法。
在使用QDBusInterface::call() 方法调用Get 时,第二个和
第三个参数对应于列出的参数
自省输出("interface" 和 "propname")。 "interface" 是
可以找到属性的位置,对于 "Interfaces" 属性
是"fi.w1.wpa_supplicant1"(这可以使用qdbusviewer来确认)。
"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() 在这里也不起作用。 QDBusArgument
type 可以容纳许多不同的元素类型,描述
在 Qt 文档中。 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"
终于!