QT application: mehrere Plugins pro Interface

Alles rund um die Programmierung mit Qt
Antworten
bluematrix
Beiträge: 12
Registriert: 22. Januar 2011 15:56

QT application: mehrere Plugins pro Interface

Beitrag 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;
 } 
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
bluematrix
Beiträge: 12
Registriert: 22. Januar 2011 15:56

Beitrag 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.
bluematrix
Beiträge: 12
Registriert: 22. Januar 2011 15:56

Beitrag 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
bluematrix
Beiträge: 12
Registriert: 22. Januar 2011 15:56

Beitrag von bluematrix »

ich bin noch nicht zum testen gekommen...
aber hat keiner ein kleines Beispiel?
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag 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
mfg
Günni
Antworten