我试图用参数调用一个方法。
例如,列表服务。
这段代码
#include <QtDBus>
#include <QDebug>
QDBusMessage callDbusMethod(QString method, QList<QVariant> args= {}) {
QDBusMessage msg;
if(QDBusConnection::systemBus().isConnected()) {
QDBusInterface iface("org.freedesktop.systemd1", "/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager", QDBusConnection::systemBus());
if(iface.isValid())
msg= args.isEmpty() ? iface.call(QDBus::AutoDetect, method.toLatin1())
: iface.callWithArgumentList(QDBus::AutoDetect, method.toLatin1(), args);
if(msg.type() == QDBusMessage::ErrorMessage)
qDebug() << msg.errorMessage(); }
return msg;
}
typedef struct {
QString path, state; } UnitFile;
int main() {
QDBusMessage msg= callDbusMethod("ListUnitFilesByPatterns",
QList<QVariant>{ QVariant(""), QVariant("*.service") });
//QDBusMessage msg= callDbusMethod("ListUnitFiles");
if(msg.arguments().size()) {
const QDBusArgument argUnitFiles= msg.arguments().at(0).value<QDBusArgument>();
argUnitFiles.beginArray();
while(!argUnitFiles.atEnd()) {
UnitFile unit;
argUnitFiles.beginStructure();
argUnitFiles >> unit.path >> unit.state;
argUnitFiles.endStructure();
qDebug() << unit.path; }
argUnitFiles.endArray(); }
}返回
“无效的参数'ss‘调用org.freedesktop.systemd1.Manager.ListUnitFilesByPatterns(),,期望’ss‘.”
以及如何正确调用该方法。
发布于 2022-07-20 16:19:36
你已经在评论中回答了你的问题。但我想我应该在这里解释更多。
在提交中,您将传递ss的参数列表,因为您的QList有两个QVariants,它们是字符串。org.freedesktop.systemd1.Manager.ListUnitFilesByPatterns的签名是asas或两个字符串数组。根据qt's dbus类型系统的说法,as自动去封送成一个QStringList.因此,您需要一个QList of QVariants,即QStringLists。
所以..。
QList<QVariant> args = { QVariant(""), QVariant("*.service") };应该是
QList<QVariant> args = { QStringList() << "", QStringList() << "*.service" };https://stackoverflow.com/questions/45076873
复制相似问题