seit langer Zeit hab ich wieder was mit Qt zu tun. Diesmal geht es u.a. darum, D-Bus-Funktionen in eine bestehende Anwendung einzubauen. Doch leider stellt sich die Dokumentation im Web zu dem Thema als überaus bescheiden heraus. Funktionierende Beispiele habe ich überhaupt nicht gefunden, trotz dutzender Suchbegriffe diverser Klassennamen etc.
Also ich kann bislang einen Service registrieren und ein Objekt darauf veröffentlichen. Wenn ich im 2. Prozess eine Method-Call-Nachricht absende, kommt sie auch an und die Methode des veröffentlichten Objekts wird ausgeführt. Wenn ich nun aber den Weg zuende gehen möchte, um das Objekt nahtlos in der Client-Anwendung zu verwenden, haut gar nichts mehr hin. Zuletzt gab es Linker-Fehler.
Hier mein Code:
IpcServer.h
Code: Alles auswählen
#ifndef IPCSERVER_H
#define IPCSERVER_H
#include <QObject>
class IpcServer : public QObject
{
Q_OBJECT
public:
explicit IpcServer(QObject *parent = 0);
void pressButton();
signals:
public slots:
void TestSlot();
};
#endif // IPCSERVER_HCode: Alles auswählen
#include <Utils/Logger.h>
#include "IpcServer.h"
IpcServer::IpcServer(QObject *parent) :
QObject(parent)
{
}
void IpcServer::pressButton()
{
LOG_Debug("IPC: pressButton");
}
void IpcServer::TestSlot()
{
LOG_Debug("IPC TEST SLOT");
}Code: Alles auswählen
QDBusConnection bus = QDBusConnection::systemBus();
IpcServer svr;
bus.interface()->registerService("xy.Terminal");
bus.registerObject("/terminal", (QObject *) &svr, QDBusConnection::ExportAllContents);Code: Alles auswählen
#include <QDebug>
#include <QtDBus>
#include "ServerMain/IpcServer.h"
int main()
{
QDBusConnection bus = QDBusConnection::systemBus();
/*
QDBusMessage msg = QDBusMessage::createMethodCall("xy.Terminal", "/terminal", "", "TestSlot");
QDBusMessage reply = bus.call(msg);
qDebug() << reply;
*/
QObject *obj = bus.objectRegisteredAt("/terminal");
IpcServer *svr;
if (obj && (svr = qobject_cast<IpcServer*>(obj))) // Diese Zeile hab ich irgendwo in nem KDE-Programm gefunden, mit Google Code Search
{
svr->pressButton();
}
return 0;
}undefined reference to 'IpcServer::staticMetaObject'
undefined reference to 'IpcServer::pressButton'
Ist ja klar, weil der Code vom IpcServer ja nicht im Client liegt, sondern nur im Server. Nun hab ich irgendwas von nem QDBusAbstractInterface gelesen, aber wie man damit umzugehen hat, kann mir niemand erklären, auch nicht die Qt-Dokumentation.
Hat hier schonmal jemand D-Bus in Qt verwendet und kann mir verraten, wie das geht? Vielleicht könnte mir sogar jemand ein Beispiel machen, damit ich es auch mal verstehe?