[gelöst] Plug-In's bauen mit Qt
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
[gelöst] Plug-In's bauen mit Qt
Hallo, ich versuche gerade ein Qt Programm um Plug-ins zu erweitern.
Dazu habe ich ein paar Versuche mit QLibrary gemaucht. Doch irgenwie bekomme ich das ganze nicht zum laufen. Die Plug-Ins sollen auch in Qt sein.
Später sollen die auch mit Slots und Signale an das Hauptprogramm angebunden werden. Die Doku von Qt zu diesem Thema ist nicht gerade ergiebig. Hat jemand schon mal was zu Thema gemacht?
Dazu habe ich ein paar Versuche mit QLibrary gemaucht. Doch irgenwie bekomme ich das ganze nicht zum laufen. Die Plug-Ins sollen auch in Qt sein.
Später sollen die auch mit Slots und Signale an das Hauptprogramm angebunden werden. Die Doku von Qt zu diesem Thema ist nicht gerade ergiebig. Hat jemand schon mal was zu Thema gemacht?
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Also Signale und Slots zwischen Libs und Core Anwendungen gehen nicht direkt, sondern immer nur über eine ausgelagerte Funktion.
Zu dem Lib Thema gibt es mehrere "gute" Lösungen, kommt immer darauf an, was genau man damit machen will. Deine Ausführung ist sehr allgemein gehalten und könnte alles oder auch gar nichts bedeuten.
1. Lösung:
Class Loading: factory++, s11n.net
2. Lösung:
Modul System wie es Qt selber hat, sehr änhlich Class Loading, bloß ohne weitere API.
3. Lösung einfache Module, die direkt geladen werden und je nach Verfügbarkeit verwendet werden können.
Erzähl doch einmal dein vorhanden an einem konkreten Beispiel, ich denke mit der 2. Lösung bist du auf jeden Fall auf der richtigen Seite. Wie du das allerdings umsetzt, kannst nur du wissen. Du solltest dir folgende Fragen stellen:
Welche Funktionen braucht mein Plugin?
Brauche ich mehrfach geladne Plugins, oder soll nur eines geladen werden?
Ich habe so ein Plugin System, was du nur an die nötigen Gegebenheiten anpassen musst, ist LGPL. Ist unter der Sektion Entwickler -> Formular SDK auf der Homepage in meinem Profil.
Zu dem Lib Thema gibt es mehrere "gute" Lösungen, kommt immer darauf an, was genau man damit machen will. Deine Ausführung ist sehr allgemein gehalten und könnte alles oder auch gar nichts bedeuten.
1. Lösung:
Class Loading: factory++, s11n.net
2. Lösung:
Modul System wie es Qt selber hat, sehr änhlich Class Loading, bloß ohne weitere API.
3. Lösung einfache Module, die direkt geladen werden und je nach Verfügbarkeit verwendet werden können.
Erzähl doch einmal dein vorhanden an einem konkreten Beispiel, ich denke mit der 2. Lösung bist du auf jeden Fall auf der richtigen Seite. Wie du das allerdings umsetzt, kannst nur du wissen. Du solltest dir folgende Fragen stellen:
Welche Funktionen braucht mein Plugin?
Brauche ich mehrfach geladne Plugins, oder soll nur eines geladen werden?
Ich habe so ein Plugin System, was du nur an die nötigen Gegebenheiten anpassen musst, ist LGPL. Ist unter der Sektion Entwickler -> Formular SDK auf der Homepage in meinem Profil.
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
Ich binn gerade dabie Qt4 zu studieren. Und es schau aus, als ob es dort leichter ist. Da warte ich mal bis Qt4 wirklich fertig ist. Derto dort soll es denn mit einem Interfache und ein paar Macros gehen. Na mal schauen. Denn das würde denn 2. entsprechen. Denn es sollte nicht Linux spezifisch sein.
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
Hallo Florian,FlorianBecker hat geschrieben:Also Signale und Slots zwischen Libs und Core Anwendungen gehen nicht direkt, sondern immer nur über eine ausgelagerte Funktion.
[..cut..]
1. Lösung:
Class Loading: factory++, s11n.net
2. Lösung:
Modul System wie es Qt selber hat, sehr änhlich Class Loading, bloß ohne weitere API.
3. Lösung einfache Module, die direkt geladen werden und je nach Verfügbarkeit verwendet werden können.
Erzähl doch einmal dein vorhanden an einem konkreten Beispiel, ich denke mit der 2. Lösung bist du auf jeden Fall auf der richtigen Seite. Wie du das allerdings umsetzt, kannst nur du wissen. Du solltest dir folgende Fragen stellen:
Welche Funktionen braucht mein Plugin?
Brauche ich mehrfach geladne Plugins, oder soll nur eines geladen werden?
Ich habe so ein Plugin System, was du nur an die nötigen Gegebenheiten anpassen musst, ist LGPL. Ist unter der Sektion Entwickler -> Formular SDK auf der Homepage in meinem Profil.
ich habe zu dem Thema auch eine Frage. Mein Problem ist dasselbe bzw. ein ähnliches. Meine Hauptapplikation (QMainWindow), wird von einigen selbst erstellten DLLs mit Leben gefüllt.
Soll heißen, diese DLLs füllen die Tool- und die MenuBar des Hauptfensters. Es wird auch alles richtig angezeigt. Also Buttons und Menubareinträge sind vorhanden. Ein Plugin z.B. kann z.B. mehrere Icons in die Toolbar "anmelden" bzw. mehrere Funktionalitäten bereitstellen.
Leider werden die Slots zu den Toolbaricons in den DLLs nicht ausgeführt. Ich denke das die Events nicht bis in die DLL vordringen. Ich übergebe einen Pointer meines Hauptfensters in die DLLs, um so den Sender der Events festzulegen aber es passiert leider nichts beim Klick. Ein solcher Mechanismus muß doch irgendwie möglich sein, dass sich DLL's an meine Applikation quasi andocken können und die Events dann direkt zu den DLL's geleitet werden. Ich will dies erreichen, da eine DLL mehrere Funktionalitäten haben kann, und man die Anzahl nicht vorhersagen kann, da später andere Entwickler Plugins für diese Applikationen schreiben sollen.
Ich benutze im Code nicht QLibrary oder QWidgetPlugin, sondern "normale" C++-Klassen als Schnittstelle, was bislang einwandfrei funktioniert hat.
Code: Alles auswählen
m_FileSave = new QAction(saveIcon, "&Speichern", QAccel::stringToKey("Ctrl+S"), m_ParentWindow);
m_FileSave->setStatusTip("Speichert das aktuelle Projekt");
m_FileSave->setWhatsThis("Speichern.\n\nSpeichert das aktuelle Projekt");
QObject::connect(m_FileSave, SIGNAL(activated()), m_ParentWindow, SLOT(slotSave()));Hallo,
ich arbeite mit Shadow zusammen und leider sind diese Antworten auf unsere Fragen leider nur mäßig.
Unsere Frage lautet:
Wie bekommen wir die Signale aus der Hauptapplikation in eine DLL geleitet?
libfactory++ und s11n sind zwar nette Projekte aber so wie ich sie verstehe behandeln sie Threads und dies würde bedeuten, dass wir unser geammtes Projekt umbauen müssen was nicht in meinem Sinne ist.
Nun nocheinmal die Frage gibt es eine Möglichkeit Signale von einer Hauptapplikation zu einer DLL zu übertragen?
Ich würde darum bitten, dass nicht nur ein Einzeiler als Antwort kommt.
Wir brauchen etwas mehr Hilfe da unser Verständinis in diesem Zusammenhang recht gering ist.
Thx im Voraus
Gruß
ToTTo
ich arbeite mit Shadow zusammen und leider sind diese Antworten auf unsere Fragen leider nur mäßig.
Unsere Frage lautet:
Wie bekommen wir die Signale aus der Hauptapplikation in eine DLL geleitet?
libfactory++ und s11n sind zwar nette Projekte aber so wie ich sie verstehe behandeln sie Threads und dies würde bedeuten, dass wir unser geammtes Projekt umbauen müssen was nicht in meinem Sinne ist.
Nun nocheinmal die Frage gibt es eine Möglichkeit Signale von einer Hauptapplikation zu einer DLL zu übertragen?
Ich würde darum bitten, dass nicht nur ein Einzeiler als Antwort kommt.
Wir brauchen etwas mehr Hilfe da unser Verständinis in diesem Zusammenhang recht gering ist.
Thx im Voraus
Gruß
ToTTo
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Wir haben unser Problem mittlerweile in den Griff bekommen. Der elegante Mechanismus, den wir uns ausgedacht haben, ist weder in QT3.x, noch in QT4.x so direkt möglich (es melden sich alle Plugins an der Hauptapplikation beim Laden dieser selbst an und stellen Funktionen automatisch bereit). Es muß definitv mit QPlugins und dem QPluginLoader gearbeitet werden, um dann in der Hauptapplikation mittels QObject::sender() das entsprechende Widget (oder QAction) zu finden, welches Plugin sich zuletzt "gemeldet" hat bzw. welcher Toolbar-Button etc. gerade angeklickt wurde, um kurz den Ansatz zu nennen, wie es wirklich funktioniert. Sämtliche QActions müssen dazu aus den Plugins müssen von der Hauptapplikation hinzugefügt werden. Leider ist die QT4-Dokumentation bezgl. der Entwicklung von Plugins sehr dürftig.FlorianBecker hat geschrieben:libfactory++ hat mit Threads überhaupt nichts zu tun. Es werden definierte Einstiegspunkte festgelegt, die man dann mit dem jeweiligen Programm direkt aufrufen kann. Das ganze nennt sich ClassMapping und geht unter wirklich jedem OS, da es nur eine Template Library darstellt.