首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串数组参数调用QtDBus方法

使用字符串数组参数调用QtDBus方法
EN

Stack Overflow用户
提问于 2017-07-13 09:39:04
回答 1查看 905关注 0票数 0

我试图用参数调用一个方法。

例如,列表服务。

这段代码

代码语言:javascript
复制
#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‘.”

以及如何正确调用该方法。

EN

回答 1

Stack Overflow用户

发布于 2022-07-20 16:19:36

你已经在评论中回答了你的问题。但我想我应该在这里解释更多。

在提交中,您将传递ss的参数列表,因为您的QList有两个QVariants,它们是字符串。org.freedesktop.systemd1.Manager.ListUnitFilesByPatterns的签名是asas或两个字符串数组。根据qt's dbus类型系统的说法,as自动去封送成一个QStringList.因此,您需要一个QList of QVariants,即QStringLists。

所以..。

代码语言:javascript
复制
QList<QVariant> args = { QVariant(""), QVariant("*.service") };

应该是

代码语言:javascript
复制
QList<QVariant> args = { QStringList() << "", QStringList() << "*.service" };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45076873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档