Seite 1 von 1

QT application: mehrere Plugins pro Interface

Verfasst: 14. Juni 2011 09:25
von bluematrix
Hallo,

ich beschäftige mich zur Zeit mit Qt und der Erstellung von eigenen Plugins.
Ich habe das Echoplugin erfolgreich umgesetzt und auch schon ein plugin mit eigenem Interface für mein programm erstellt. Funktioniert alles bestens.

Hilfe benötige ich für die Verwaltung der einzelnen plugins.
Mein Programm erstellt aus verschiedenen Daten mit Hilfe von Postprozessoren einen speziellen Quellcode.
Die Postprozessoren möchte ich flexibel als plugin/dll einbinden. Somit kann ich immer mehr Prozessoren integrieren,ohne jedes mal das ganze Programm neu zu
bauen.

Code: Alles auswählen

-                                           Postprozessor 1
-Datenwidget --> Selector --> Postprozessor 2  --> Textwidget mit dem Code
-                                           Postprozessor 3 


Alle Postprozessoren verwenden das gleiche Interface.
Der jeweilige Postprozessor wird in einer Combobox ausgewählt.

Wie muss ich die einzelnen Plugins/Postprozessoren verwalten, so dass dass ich mit meiner Combobox als selector zwischen Ihnen wechseln kann?

Mein bisher noch einzelnes Plugin wird wie in dem Echoplugin Beispiel geladen:

Code: Alles auswählen

 bool mainwindow::loadPlugin()
 {
     QDir pluginsDir(qApp->applicationDirPath());
 #if defined(Q_OS_WIN)
     if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
         pluginsDir.cdUp();
 #elif defined(Q_OS_MAC)
     if (pluginsDir.dirName() == "MacOS") {
         pluginsDir.cdUp();
         pluginsDir.cdUp();
         pluginsDir.cdUp();
     }
 #endif
     pluginsDir.cd("plugins");
     foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
         QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
         QObject *plugin = pluginLoader.instance();
         if (plugin) {
             postprozInterface = qobject_cast<PostprozInterface *>(plugin);
             if (PostprozInterface)
                 return true;
         }
     }

     return false;
 } 

Verfasst: 14. Juni 2011 11:52
von franzf
Eine QMap<QString, PostprozInterface*> würde sich doch zum Speichern der Plugins anbieten? Der key (QString) kann direkt als Eintrag in die ComboBox gepackt werden, die Combobox kannst du dann gleich mit map.keys() füllen.

Verfasst: 14. Juni 2011 11:55
von RHBaum
Kenn mich mit dem QPluginMechanismus ned so aus.
Der hat auch Nachteile (sprich, der iss die Hoelle, wenn Plugins mehrere Apps bedienen koennen sollen, die wenns geht noch unterschiedliche QT versionen haben, und wenn DU nicht alle PluginEntwickler unter Kontrolle hasst )

Wir haben unser eigenes Framework dafuer. Da gibts auch andere Begrifflichkeiten.
Wenn DU ne Dll laedst, kannst DU dir da zuerst nur die PluginFactory holen. Da hat jede Dll genau eine.
Die erzaehlt dir, welche Typen von plugins in welcher version etc unterstuetzt. noch ein Bissi Meta krams.
Unter anderem auch die info, ob ein Plugin Multiinstantiatiable ist oder nicht.
Mit CreatePlugin erzeugst Du dir das Plugin dann, mit DestroyPlugin, beides an der Factory, zerstoerst es wieder. bei Multiinstantiatiable plugins erzeugst jeweils ne neue Instanz udn zerstoerst sie, bei nicht multidinges Plugins, bekommst nur nen Zeiger refgezaehlt.

QT Plugin ist dafuer irgendwie ne hirarchie zu flach. Normal muesste fuer sowas das was Du vom PluginLoader bekommst, die Factory sein, nicht das Plugin. Die factories wiederum koennen die alle Infos liefern, die fuer deine Auswahl, aka COmboBox brauchen koenntest.
Das kannst du aber genau so nachmodellieren, auch mit Qt.

Ciao ...

Verfasst: 14. Juni 2011 12:31
von bluematrix
@ franzf
das klingt gut.
Ich werde mir mal mit Qmap ansehen. Leider habe ich damit noch nicht gearbeitet. Wenn also jemand noch ein Beispiel hat wäre ich dankbar.

Verfasst: 14. Juni 2011 12:48
von bluematrix
Hab grad beim lesen von Qmap einen QT PluginManager gefunden.
Hat damit schon mal jemand gearbeitet?

http://doc.qt.nokia.com/qtcreator-exten ... ml#details

Verfasst: 15. Juni 2011 14:31
von bluematrix
ich bin noch nicht zum testen gekommen...
aber hat keiner ein kleines Beispiel?

Verfasst: 19. Juni 2011 18:43
von guenni81
Hallo,
in dem Link den du gepostet hast geht es nicht um ein Pluginmanager von Qt, sondern einen Plugin Mechanismus der im QtCreator implementiert/umgesetzt wurde. Natürlich könnte man seinen eignen Pluginmechanismus von dort abkupfern. :D