Michael D. schrieb:
> Hi Rolf!
>
> Vielen Dank für Deine Hilfe,
>
> ja ich habe gestern dass Konzept mit der Zeiger-Zurück-Funktion weiter
> verfolgt und ausprobiert. Da bin ich dann auch über das Problem gestoßen
> dass er die Implementierung der Methoden nicht kennt (keine abstrakte
> Klasse).
In der Applikation darfst du natürlich nur die Basisklasse verwenden,
denn die Plugin-Klasse kennt ja auch nur das Plugin, und deren
Funktionen sind ja auch dort implementiert.
Das Prinzip ist auch nicht schwer. Du definierst im Hauptprogramm eine
Klasse, in der die Funktionen, die deine Plugins brauchen, als rein
virtuell stehen. Wenn das Plugin z.B. Bilder einlesen soll, könnte das
im einfachsten Fall so aussehen:
1 | class BildLeser
|
2 | {
|
3 | public:
|
4 | virtual QImage readImage(const QString& filename) = 0;
|
5 | };
|
Das Plug-in enthält dann eine Klasse, die davon ableitet:
1 | class JpegLeser : public BildLeser
|
2 | {
|
3 | public:
|
4 | virtual QImage readImage(const QString& filename);
|
5 | };
|
und dann natürlich die passende Implementation. Dann muß das Plugin noch
die erzeugungs-Funktion als extern "C" haben. Etwa sowasS:
1 | extern "C"
|
2 | BildLeser* erzeugeBildLeser()
|
3 | {
|
4 | return new JpegLeser;
|
5 | }
|
Und die Funktion kannst du dir dann per QLibrary holen und aufrufen. Die
gibt dir dann einen Zeiger auf den JpegLeser zurück, den das Programm
dann nutzen kann, ohne diese Klasse kennen zu müssen. Es kann alle
Funktionen des Objekts aufrufen, die in BildLeser deklariert sind.
> Das hat mich dann auch zu den QPlugins geführt. Hört sich ganz
> interessant an, werde ich mir genauer ansehen.
QPlugin setzt vom Prinzip her auf das oben beschriebene auf, bietet aber
mehr Komfort.