如何将 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());
}
我尝试将 bool
和 QVariant
都传递给 ::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 通信。
我正在尝试通过 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());
}
我尝试将 bool
和 QVariant
都传递给 ::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 通信。