die einfache Art, Funktionen von außen zugänglich zu machen
Verfasst: 22. November 2011 09:51
Über den DBus lassen sich Anwendungen von außen Signale (bei Bedarf auch mit Parametern) senden, worauf sie bestimmte Funktionen ausführen. Dies ermöglicht QT-Anwendungen, Slot-Funktionen auf Signale hin auszuführen, die sie von ganz anderen Anwendungen gesendet bekommen. Dafür bietet QT eigene Klassen.
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...
In der Slot-Funktion wird lediglich ein Signal gesendet, sonst ist nichts zu tun.
Der Rückgabestring wird nur benötigt, dass verschiedene externe DBus-Clients zu frieden sind, da sie ohne Rückmeldung zum Teil glauben, die Funktion sei nicht ausgeführt.
Zuletzt wird in der Ziel-Klasse ein DBus Objekt erstellt, dieses mit dem DBus verbunden und eine Verbindung zur eigentlichen Zielfunktion erstellt:
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)));