die einfache Art, Funktionen von außen zugänglich zu machen

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
GoaSkin
Beiträge: 92
Registriert: 13. Juni 2007 00:14
Wohnort: Darmstadt

die einfache Art, Funktionen von außen zugänglich zu machen

Beitrag von GoaSkin » 22. November 2011 10: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...

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);
In der Slot-Funktion wird lediglich ein Signal gesendet, sonst ist nichts zu tun.

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);
}
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:

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)));

GoaSkin
Beiträge: 92
Registriert: 13. Juni 2007 00:14
Wohnort: Darmstadt

Re: die einfache Art, Funktionen von außen zugänglich zu mac

Beitrag von GoaSkin » 22. November 2011 11:05

Noch vergessen, dass die Anmeldung am DBus in der main.cpp geschieht:

Code: Alles auswählen

QDBusConnection::sessionBus().registerService("de.domain.bildwechsel");

Antworten