Forum: PC-Programmierung QT Klasse aus Library laden


von Michael D. (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite gerade an folgendem Problem:

Ein QT Hauptprogramm soll ein selbsterstelltes QT Plugin (Library) laden 
und mit diesem über Signals und Slots kommunizieren.

Das Erstellen und das Laden des Plugins funktioniert bereits, ich weiß 
nur nicht wie ich eine Klasse des Plugins in das Hauptprogramm einbinde.
Funktionen stellen kein Problem dar, hier geht es darum die Klasse zu 
laden.

Anbei mein Code:

Hauptprogramm (Soll Library laden):
1
void MainWindow::loadLib(void) {
2
    QLibrary qlib(testlib);
3
    if(qlib.load())
4
        qDebug() << "testlib loaded!";
5
    else
6
        qDebug() << "testlib not found!";
7
}

Library:
1
class Q_DECL_EXPORT QTLibTest :QObject {
2
Q_OBJECT
3
public:
4
    QTLibTest(QObject *parent = 0);
5
public slots:
6
    void Foo1(void); // Soll später mit dem Hauptprogramm verbunden werden
7
};

Evtl. hat von Euch dass schon mal unter QT gemacht und kann mir 
weiterhelfen,

Danke,
Michael


EDIT:

Zíel wäre es im Hauptprogramm zB:
1
QTLibTest aaa;

erstellen zu können, mir kam aber gerade die Idee eine C Funktion aus 
dem Library zu importieren, welche das Objekt erstellt und den Zeiger 
darauf zurückgibt.
Trotzdem weis ich nicht ob dies ein "sauberer" Weg ist.

von Rolf Magnus (Gast)


Lesenswert?

Michael D. schrieb:
> mir kam aber gerade die Idee eine C Funktion aus dem Library zu importieren,
> welche das Objekt erstellt und den Zeiger darauf zurückgibt.

Bingo! Du mußt aber natürlich von einer abstrakten Basisklasse ableiten.

von Rolf Magnus (Gast)


Lesenswert?

Ach so, was mir noch eingefallen ist: Warum benutzt du eigentlich nicht 
gleich das  Plugin-Framework von Qt?

von Michael D. (Gast)


Lesenswert?

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

Zumindest ist das Problem hier ganz genau beschrieben (Beitrag ist nicht 
von mir):

http://www.qtforum.de/forum/viewtopic.php?f=1&t=7199&p=36495&hilit=library+Klasse+Library#p36495

Das hat mich dann auch zu den QPlugins geführt. Hört sich ganz 
interessant an, werde ich mir genauer ansehen.

Vielen Dank,
Michael

von Rolf Magnus (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.