Не могу подключить слот к сигналу 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 шт):
Вот так попробуйте:
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";
Команда 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();
}