1

QtDbusを使用して、システムで提供されるインターフェイスと通信しようとしPowerManagerています。私の目標はとてもシンプルです。DBus インターフェイスを使用してシステムを休止状態にするコードを作成します。

そこで、d-feetアプリケーションをインストールして、自分のシステムでDBus が利用できるインターフェースと、私が見たものを確認しました。

ここに画像の説明を入力

ご覧のとおり、何かを選択できるインターフェイスとメソッドがいくつかあります。私の選択は、インターフェイスorg.freedesktop.PowerManagmentのHibernate()です。

この目標では、メカニズムのみを理解するための非常に単純なコードをいくつか用意しました。もちろんQtライブラリを使用しました:

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QStringList>
#include <QtDBus/QtDBus>
#include <QDBusInterface>
int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);

    if (!QDBusConnection::sessionBus().isConnected()) {
        fprintf(stderr, "Cannot connect to the D-Bus session bus.\n"
                "To start it, run:\n"
                "\teval `dbus-launch --auto-syntax`\n");
        return 1;
    }
    QDBusInterface iface("org.freedesktop.PowerManagement" ,"/" , "" , QDBusConnection::sessionBus());
    if(iface.isValid())
    {
        qDebug() << "Is good";
        QDBusReply<QString> reply = iface.call("Methods" , "Hibernate");
        if(reply.isValid())
        {
            qDebug() << "Hibernate by by " <<  qPrintable(reply.value());
        }

        qDebug() << "some error " <<  qPrintable(reply.error().message());

    }

    return 0;
}

残念ながら、端末でエラーが発生します:


インターフェイス「(null)」の署名「s」を持つメソッド「メソッド」は存在しません

では、このコードの何が問題なのか教えてください。関数QDBusInterface::call()のいくつかの引数を忘れたと確信していますが、何ですか?

4

1 に答える 1

3

インターフェイスを作成するときは、正しいを指定する必要がありますinterface, path, service。そのため、ifaceオブジェクトは次のように作成する必要があります。

QDBusInterface iface("org.freedesktop.PowerManagement",  // from list on left
                     "/org/freedesktop/PowerManagement", // from first line of screenshot
                     "org.freedesktop.PowerManagement",  // from above Methods
                     QDBusConnection::sessionBus());

さらに、メソッドを呼び出すときは、その名前と引数 (存在する場合) を使用する必要があります。

iface.call("Hibernate");

Hibernate()出力引数がないため、使用する必要QDBusReply<void>があり、チェックできません.value()

QDBusReply<void> reply = iface.call("Hibernate");
if(reply.isValid())
{
    // reply.value() is not valid here
}
于 2015-08-26T13:48:14.720 に答える