如何将dbus变体传递到qt' s qdbusinterface ::呼叫
我试图将以下消息发送到 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());
}
我尝试传递两个bool
和qvariant
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我已经使用API的不同部分找到了解决方法...利用QDBUSMESSAGE,这可以做到:
对于任何与Connman做类似事情的人,请访问 cmst 。它使用QT通过DBU与Connman进行通信。
I have found a workaround using a different part of the API... Utilizing QDBusMessage, this can be done:
For anyone doing similar things with Connman, check out cmst. It uses Qt to communicate with Connman over DBus.