如何将 DBus 变体传递给 Qt QDBusInterface::call

How to pass a DBus variant to Qt's QDBusInterface::call

我正在尝试通过 Qt 5.12 的 DBus API 将以下消息发送到 Connman

dbus-send --system --print-reply --dest=net.connman / net.connman.Manager.SetProperty string:"OfflineMode" variant:boolean:true

如上所示,SetProperty 方法采用 dbus 字符串和 dbus 变体。

如果我查看带有 qdbus 的签名,我会得到以下信息:

$ qdbus --system net.connman / | grep Manager.SetProperty
method void net.connman.Manager.SetProperty(QString name, QDBusVariant value)

这就是我所做的...

iface.call("SetProperty", "OfflineMode", QDBusVariant(!m_flightModeOn));

但是,我得到以下编译错误:

error: no matching function for call to ‘QDBusInterface::call(const char [12], const char [12], QDBusVariant)’
         QDBusReply<QVariantMap> reply = iface.call("SetProperty", "OfflineMode", QDBusVariant(true));

完整函数如下:

void enableFlightMode()
{
    QDBusInterface iface("net.connman", "/", "net.connman.Manager", QDBusConnection::systemBus());
    if (iface.isValid()) {
        QDBusReply<QVariantMap> reply = iface.call("SetProperty", "OfflineMode", QDBusVariant(true));
    }

    qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());
}

我尝试将 boolQVariant 都传递给 ::call,但这些会导致 DBus 出现 dbus 错误:Method "SetProperty" with signature "sb" on interface "net.connman.Manager" doesn't exist。这是有道理的,因为签名是一个字符串和一个变体。

我想我的问题是,根据 Qt DBus API type system docs,QDBusVariant() 应该类似于 DBus“VARIANT”,所以我希望能够将它传递给这个函数。还有另一种方法可以通过此 API?

传递 DBus 变体吗

我找到了使用 API 的不同部分的解决方法...利用 QDBusMessage,可以做到这一点:

    QDBusMessage message = QDBusMessage::createMethodCall("net.connman", "/", "net.connman.Manager", "SetProperty");
    QList<QVariant> arguments;
    arguments << "OfflineMode" << QVariant::fromValue(QDBusVariant(true));
    message.setArguments(arguments);
    QDBusConnection::systemBus().call(message);
    qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());

任何与 Connman 做类似事情的人,请查看 cmst。它使用 Qt 通过 DBus 与 Connman 通信。