0

我正在开发一个必须实现 WiFi 连接机制的应用程序(它将是一个全屏触摸屏应用程序)。为此,我使用 DBus 与网络管理器进行通信。我成功地让它扫描访问点并将它们列在 QTableView 中。接下来将连接到所选的 wifi 网络。尝试连接时我要做的第一件事是检查系统中是否已经存在与该接入点的连接,所以我这样做:

settings = new QDBusInterface("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings", "org.freedesktop.NetworkManager.Settings", dbusConnection, this);
QDBusMessage msg = settings->call("ListConnections");
QDBusArgument arg = msg.arguments().at(0).value<QDBusArgument>();
QList<QDBusObjectPath> pathsList = qdbus_cast<QList<QDBusObjectPath>>(arg);
foreach (QDBusObjectPath p, pathsList) {
    QDBusInterface *conn = new QDBusInterface("org.freedesktop.NetworkManager", p.path(), "org.freedesktop.NetworkManager.Settings.Connection", dbusConnection);
    QDBusMessage msg = conn->call("GetSettings");
    qDebug() << "Reply: " << msg;
}

我收到了消息并且可以使用 qDebug() 读取它。该消息采用 d-bus 格式:a{sa{sv}}正如 Network Manager 的文档所述。而且我无法将其解析为任何可用的形式。据我了解,我应该将数据放入的等效 Qt 类是:

QList<QMap<QString, QMap<QString, QVariant>>>

而且我认为我应该使用 QDBusArgument 类来完成它,但无法弄清楚它应该如何完成。有人能告诉我最好的方法是什么吗?

谢谢。

4

1 回答 1

0

我设法解决了我的问题,事实证明这很容易。我创建了地图对象并使用了 >> 运算符:

QDBusArgument arg = args.at(0).value<QDBusArgument>();
QMap<QString, QMap<QString, QVariant>> map;
arg >> map;
于 2020-11-19T09:16:41.850 回答