如何将 DBus 变体传递给 Qt 的 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类型的系统文档,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());

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

相关内容

  • 没有找到相关文章

最新更新