Не могу подключить слот к сигналу QDbus

#include <QApplication>
#include <QWidget>
#include <QDBusConnection>
#include <QDebug>

class Window: public QWidget
{
public:
    Window(){}

    void slot(QString str, QVariantMap map, QStringList list)
    {
        qDebug() << str << map << list;
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Window *win = new Window();
    QDBusConnection con = QDBusConnection::sessionBus();
    bool result = con.connect("org.mpris.MediaPlayer2.chromium.instance14494",
                              "/org/mpris/MediaPlayer2",
                              "org.freedesktop.Properties",
                              "PropertiesChanged", win, SLOT(slot(QString, QVariantMap, QStringList)));
    qDebug() << result;
    return app.exec();
}

При запуске программы с QDBUS_DEBUG=1

Я получаю следующее:

QDBusConnectionPrivate(0x7fb450003a00) : connected successfully
QDBusConnectionPrivate(0x7fb450003a00) got message (signal): QDBusMessage(type=Signal, service="org.freedesktop.DBus", path="/org/freedesktop/DBus", interface="org.freedesktop.DBus", member="NameAcquired", signature="s", contents=(":1.1735") )
QDBusConnectionPrivate(0x7fb450003a00) delivery is suspended
false
QDBusConnectionPrivate(0x7fb450003a00) dequeueing message QDBusMessage(type=Signal, service="org.freedesktop.DBus", path="/org/freedesktop/DBus", interface="org.freedesktop.DBus", member="NameAcquired", signature="s", contents=(":1.1735") )

При переключении музыкального трека в браузере, вывод в терминале не меняется, по dbus-monitor видно, как дёргается сигнал PropertiesChanged.

Так же я знаю что у org.mpris.MediaPlayer2.chromium.instance14494 после перезапуска хромиума меняются на конце цифры, пробовал с vlc, результат один и тот же.


Ответы (2 шт):

Автор решения: Alexander Chernin

Вот так попробуйте:

class Window: public QWidget
{
    Q_OBJECT // + макрос
public:
    Window(){}

public slots: // + slots
    void slot(QString str, QVariantMap map, QStringList list) {
        qDebug() << str << map << list;
    }
};

int main(...) {
    ...
}

// + Так как Q_OBJECT класс находится в одном файле с main.cpp, то надо подключить 
// мос-файл для нормальной сборки проекта
#include "main.moc";
→ Ссылка
Автор решения: magrif

Команда dbus-monitor --session | grep MediaPlayer2 -A10 мне не выдаёт в поле sender org.mpris.MediaPlayer2.chromium.instance14493 (в моём случае), хотя qdbusviewer его отображает. Зато в этом поле присутствует значение :1.157:

signal time=1615138292.971503 sender=:1.157 -> destination=(null destination) serial=154 path=/org/mpris/MediaPlayer2; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.mpris.MediaPlayer2.Player"
   array [
      dict entry(
         string "PlaybackStatus"
         variant             string "Playing"
      )
   ]
   array [
   ]

Поменяв код на

bool result = con.connect(":1.157",
                          "/org/mpris/MediaPlayer2",
                          "org.freedesktop.Properties",
                          "PropertiesChanged", win, SLOT(slot(QString, QVariantMap, QStringList)));

должно в result вернуть true и в слот прилетать:

"org.mpris.MediaPlayer2.Player" QMap(("PlaybackStatus", QVariant(QString, "Playing"))) ()
"org.mpris.MediaPlayer2.Player" QMap(("PlaybackStatus", QVariant(QString, "Paused"))) ()

Тестировал на вот этих ребятах в хромиуме.

dbuslistener.h

#ifndef DBUSLISTENER_H
#define DBUSLISTENER_H

#include <QObject>
#include <QVariantMap>

class DbusListener : public QObject
{
    Q_OBJECT
public:
    explicit DbusListener(QObject *parent = Q_NULLPTR);

signals:

public slots:
    void slot(QString s, QVariantMap m, QStringList l);

};

#endif // DBUSLISTENER_H

dbuslistener.cpp

#include "dbuslistener.h"
#include <QDBusConnection>
#include <QDebug>
#include <QDBusError>

DbusListener::
DbusListener(QObject *parent) :
    QObject(parent)
{
    QDBusConnection con = QDBusConnection::sessionBus();
    if(!con.isConnected()) {
        qFatal("Bus error");
    }

    qDebug() << con.connect(":1.264",
                "/org/mpris/MediaPlayer2",
                "org.freedesktop.DBus.Properties",
                "PropertiesChanged",
                this,
                SLOT(slot(QString, QVariantMap, QStringList)));
}

void DbusListener::slot(QString s, QVariantMap m, QStringList l)
{
    qDebug() << "SIGNAL" << s << m << l;
}

main.cpp

#include <QCoreApplication>
#include "dbuslistener.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    DbusListener dbs;

    return a.exec();
}
→ Ссылка