Wir schreiben an einer Anwendung, die zahlreiche Plugins verwenden soll, von denen wiederum jedes mehrere Interfaces exportiert. Falls wir die Dokumentation richtig verstehen, hat jedes Plugin ein "root object", das exportiert wird und alle Interfaces anbietet, die es im Plugin gibt.
Da wir die Implementierung der Interfaces über mehrere Klassen verteilen wollen (um ein unmögliches großes root object zu verweiden), landen wir bei einer Architektur, bei der das root object alle Interfaces anbietet, aber nichts tut, als Funktionsaufrufe an Kindklassen weiter zu leiten, die dann für die Implementierung einzelner Interfaces zuständig sind. Etwa so:
Code: Alles auswählen
//###################################
struct I1 //Interface1
{
virtual ~I1() {};
virtual void f1() = 0;
virtual void f2() = 0;
signals:
virtual void aSignal() = 0;
};
Q_DECLARE_INTERFACE(...)
//###################################
struct I2 //Interface2
{
virtual ~I2() {};
virtual void g1() = 0;
virtual void g2() = 0;
};
Q_DECLARE_INTERFACE(...)
//###################################
class Impl1 : public QObject, public I1 // Child class 1
{
//...
};
//###################################
class Impl2 : public QObject, public I2 // Child class 2
{
//...
};
//###################################
class PluginRoot : public QObject, public I1, public I2 // Root class
{
Q_OBJECT
Q_INTERFACES(I1 I2)
public:
PluginRoot()
{
pImpl1 = new Impl1(this);
pImpl2 = new Impl2(this);
connect( pImpl1, SIGNAL(aSignal()), this, SIGNAL(aSignal()) );
};
virtual ~PluginRoot();
// I1
virtual void f1() { return pImpl1->f1(); };
virtual void f1() { return pImpl1->f2(); };
// I2
virtual void g1() { return pImpl2->g1(); };
virtual void g2() { return pImpl2->g2(); };
signals:
virtual void aSignal();
private:
QObject* pImpl1;
QObject* pImpl2;
};
Q_EXPORT_PLUGIN2(..., PluginRoot)
Gibt es einen vernünftigeren Weg, das Ganze anzugehen?
Danke für Eure Hilfe!
Shaka
P.S: Da es mannigfaltige Kommunikation zwischen den verschiedenen Kind-Klassen gibt, ist es keine Option, das Ganze auf mehrere Plugins aufzuteilen...