Die QT-Beispiele, die den DBus nutzen, sind aber recht kompliziert und für Anfänger kaum verständlich.
Ich habe mir dazu eine Lösung ausgedacht, die zwar nicht unbedingt die Eleganteste ist, aber mit wenig Aufwand auf eine plausible Art ihren Zweck erfüllt. So oder so benötigt man eine extra DBus-Klasse im Programm, die entweder im Hauptprogramm oder von der Hauptfenster-Klasse her als Child aufgerufen wird. Ich mache das nun so, dass ich eine DBus-Klasse definiere, die in jene Klasse eingebunden wird, in der es die von außen aufzurufenden Slot-Funktionen gibt. Im Unterschied zu den üblichen Beispielen fungiert die DBus-Klasse hier jedoch mehr als Signal-Slot-Proxy. Sie meldet am DBus Slot-Funktionen an, um daraus wieder normale QT-Signale zu erzeugen.
Im Header wird ein Signal und ein Slot deklariert...
Code: Alles auswählen
#include <QtCore/QObject>
#include <QtDBus/QtDBus>
class DBusSteuerung: public QObject
{
Q_OBJECT
signals:
void switched(QString);
public:
DBusSteuerung(QWidget *parent = 0);
public slots: // METHODS
QString bildWechsel(const QString &arg);
Code: Alles auswählen
#include "dbus_steuerung.h"
DBusSteuerung::DBusSteuerung(QWidget *parent)
{
// nichts zu tun
}
QString DBusSteuerung::bildWechsel(const QString &arg)
{
emit switched(arg);
return QString("switchImage(\"%1\") got called").arg(arg);
}
Zuletzt wird in der Ziel-Klasse ein DBus Objekt erstellt, dieses mit dem DBus verbunden und eine Verbindung zur eigentlichen Zielfunktion erstellt:
Code: Alles auswählen
// DBus verbinden
DBusSteuerung *control = new DBusSteuerung(this);
QDBusConnection::sessionBus().registerObject("/", control, QDBusConnection::ExportAllSlots);
connect(control, SIGNAL(switched(QString)), SLOT(playNext(QString)));