如何将dbus变体传递到qt' s qdbusinterface ::呼叫

发布于 2025-01-21 06:51:49 字数 1975 浏览 4 评论 0原文

我试图将以下消息发送到 connman> connman 5.12的dbus api:

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 to :: call,但是这些导致dbus中的dbus错误:方法“ setProperty with签名” sb“ on interface” net.connman.manager“不存在。这是有道理的,因为签名是字符串和变体。

我想我的问题是,根据 qt qt dbus api api类型系统文档>,qdbusvariant()应该类似于dbus“ variant”,因此我希望能够将其传递到此函数中。有其他方法可以通过此API通过DBUS变体吗?

I am trying to send the following message to Connman over Qt 5.12's DBus API:

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

As seen, the SetProperty method takes a dbus string and a dbus variant.

If I look at the signature with qdbus, I get the following:

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

So that's what I do...

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

However, I get the following compile error:

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));

Here is the complete function:

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());
}

I have tried passing both a bool and a QVariant to ::call, but those result in DBus in a dbus error: Method "SetProperty" with signature "sb" on interface "net.connman.Manager" doesn't exist. This makes sense since the signature is a string and a variant.

I guess my question is, according to the Qt DBus API type system docs, QDBusVariant() is supposed to be analogous to the DBus "VARIANT", so I would expect to be able to pass it into this function. Is there another way I can pass a DBus variant through this API?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

万人眼中万个我 2025-01-28 06:51:49

我已经使用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通过DBU与Connman进行通信。

I have found a workaround using a different part of the API... Utilizing QDBusMessage, this can be done:

    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());

For anyone doing similar things with Connman, check out cmst. It uses Qt to communicate with Connman over DBus.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文